2009-08-21 2 views
0

私はdbでUTF-8文字を扱っていて、データベースに入れる前にutf-8からasciiに変換するためにphp inconv関数を使っています。mysqlインデックスはUTF-8をASCIIに変換しますか?

このようにして、私はデータベースに問い合わせる前にクエリをASCIIに変換すると思いました。 しかし、今私はmysqlが私のためにこの翻訳を行うと信じてくれる結果を見ています。それが正しいかどう

は誰もが知っている、と私は(とにかく非常に効果的ではない)、PHPでの全体inconvをスキップすることができます。一例として、

、それがASCIIへの変換は、ある時点で起こっていることを信じて私をリードして「lësci」リターン「Lesci」を検索。

テーブルはutf_8_unicode_ciでエンコードされています。 フィールドはフルテキストインデックスを持つvarchar(255)です。 クエリはかなり単純です "SELECT * FROM users WHERE name = 'lësci'"は 'lsci'と 'Lesci'の両方を返します。

+0

私はMySQL 5.0.75で試してみましたが、あなたが説明しているように問題はありません。 'l'sci'と 'Lesci'はそれぞれの文字列にのみ一致します。どのバージョンのMySQLを使用しているか、テーブル定義は何ですか?また、問題を示すクエリの例は何ですか? –

+0

ありがとうBill、私はMySQL 5.027を使用しています。このテーブルはutf_8_unicode_ciでエンコードされています。フィールドはフルテキストインデックスを持つvarchar(255)です。 クエリはかなり単純です "SELECT * FROM users WHERE name = 'lësci'"は 'lsci'と 'Lesci'の両方を返します。 – pedalpete

+0

私はまだあなたが記述した動作を再現できません。照合の名前を指定しましたが、文字セットは指定しません。あなたは単に '' SHOW CREATE TABLE users'の結果を与えることができますか?また、あなたのセッションの文字セットと照合は何ですか?(つまり、 'SET NAMES'コマンドを実行しましたか?) –

答えて

1

インデックスとしてutf8_unicode_ci照合を使用すると仮定します。照合はトリックでした。実際にはすべてをASCIIに変換するのではなく、アクセント記号と生の文字の間のマッピングを処理します。

utf8_generic_ciは、このマッピングがはるかに簡単なため、同等のものとして扱われない可能性があるため、より高速です。

+0

これは私が思っていたものですが、インデックスは完全なものではなく、通常のインデックスであることに気付きました。 – pedalpete

関連する問題