18

アクセント付き文字を正規化するクエリを実行できるようにしたいので、たとえば次のようにします。

é, è, and ê

「=」および「like」を使用するクエリでは、すべて「e」として扱われます。ユーザー名フィールドが ' rené ' に設定された行があり、 ' rene ' と ' rené ' の両方と一致させたいと考えています。

MySQL 5.0.8 の「collat​​e」句を使用してこれを実行しようとしています。次のエラーが表示されます。

mysql> select * from User where username = 'rené' collate utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

FWIW、私のテーブルは次のもので作成されました:

CREATE TABLE `User` (
  `id` bigint(19) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniqueUsername` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=56790 DEFAULT CHARSET=utf8
4

5 に答える 5

11

エラーの原因はテーブルではなく、入力の文字セット、つまりクエリの 'rené' にあります。動作はcharacter_set_connection変数によって異なります。

文字セット イントロデューサを持たないリテラルおよび数値から文字列への変換に使用される文字セット。

MySQL クライアントを使用して、次を使用して変更しますSET NAMES

SET NAMES 'charset_name' ステートメントは、次の 3 つのステートメントと同等です。

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

( http://dev.mysql.com/doc/refman/5.5/en/charset-connection.htmlから)

出力例:

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = 'rené' collate utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = 'rené' collate utf8_general_ci;
Empty set (0.00 sec)

または、「文字セット イントロデューサー」を使用して文字セットを明示的に設定することもできます。

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = _utf8'rené' collate utf8_general_ci;
Empty set (0.00 sec)

私はこの質問がかなり古いことを知っていますが、Googleが関連する質問のために私をここに導いたので、私はまだ答えに値します:)

于 2013-06-03T13:52:38.160 に答える
7

実際のユーザー名に加えて、正規化されたバージョンをテーブルに保存することをお勧めします。その場でエンコーディングを変更するとコストがかかる可能性があり、検索ごとにすべての行に対して再度変換を行う必要があります。

PHP を使用している場合は、iconv()を使用して変換を処理できます。

$username = 'rené';
$normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

次に、両方のバージョンを保存し、正規化されたバージョンを検索に使用し、通常のユーザー名を表示に使用します。検索文字列も正規化すると、正規化された列からの比較と選択が大幅に高速になります。

$search = mysql_real_escape_string(iconv('UTF-8', 'ASCII//TRANSLIT', $_GET['search']));
mysql_query("SELECT * FROM User WHERE normalized LIKE '%".$search."%'");

もちろん、正規化が必要な列がいくつかある場合、この方法は実行できない可能性がありますが、特定のケースではこれで問題なく機能する可能性があります。

于 2010-02-20T16:34:10.840 に答える
6

MySQL に strtr php 関数/tr unix コマンドを実装しました。ここでソースを入手できます。

次のように使用できます。

SELECT tr(name, 'áäèëî', 'aaeei') FROM persons

またはいくつかの文字を取り除く

SELECT tr(name, 'áäèëî', null) FROM persons
于 2012-10-22T23:58:58.523 に答える
4
$normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

完璧なphpソリューションですが、mysqlでは?変換?

mysqlで

SELECT 'Álvaro José' as accented, (CONVERT ('Álvaro José' USING ascii)) as notaccented

生産:

Álvaro José     ?lvaro Jos?

アクセントのある単語は、アクセントのない単語に変換されません。これは、iconvの音訳と同等ではありません。

RegExpはUTF-8では機能しません。

解決策はありません。

于 2011-05-20T15:21:30.873 に答える