21

文字セットとして「utf8 -- UTF-8 Unicode」のスキーマと「utf8_spanish_ci」の照合があります。

すべての内部テーブルは、前述の文字セットと照合順序が同じ InnoDB です。

問題は次のとおりです。

のようなクエリで

SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';

83 行の結果が得られます。私はそれを知っているので、84の結果が必要です。

場所の変更:

WHERE p.NAME LIKE '%JOSE%';

私はまったく同じ83行を取得します。JoSe、Jose、JOSe などの組み合わせで、同じ 83 行すべてが報告されます。

問題は、アクセントがゲームで再生されるときに発生します。もしそうなら:

WHERE p.NAME LIKE '%josé%';

結果が出ません。0 行。

しかし、もしそうなら:

WHERE p.NAME LIKE '%JOSÉ%';

結果の行は1つだけなので、1行です。これは、"jose" にアクセントを付けて大文字にした唯一の行です。

アクセント付きの文字が大文字のままかどうかにかかわらず、josÉ、JoSÉ、または任意の組み合わせで試しました。データベースに実際に保存され、まだ唯一の行を返すためです。JOSE で大文字と小文字をどのように組み合わせても、突然 "É" を "é" に変更すると、行が返されません。

結論:

  • ゲームでラテン文字が使用されない場合、大文字と小文字は区別されません。
  • ラテン文字が表示される場合、大文字と小文字が区別されます。
  • JOSE または jose を検索した場合と同様に、アクセントに敏感で、必要な 84 行ではなく、83 行しか取得できません。

私は何をしたいですか?

  • 「jose」、「JOSE」、「José」、「JOSÉ」、「JÒSE」、「jöse」、「JoSÈ」などを検索するには、存在することがわかっている 84 行を返す必要があります。検索を大文字と小文字を区別せず、「ラテン語」を区別しないようにするにはどうすればよいでしょうか。

のような解決策は私COLLATIONLIKEはうまくいきません。理由がわかりません...

私に何ができる?

編集:

私が次のようなことをした場合:

WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;

エラーが発生します:

COLLATION 'utf8_general_ci' は CHARACTER SET 'latin1' には無効です

また、列で可能なすべての照合順序も変更しました。

そして、私が次のようなことをすると:

WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

あたかも何も作っていないかのように、同じ83行が報告されます...

4

2 に答える 2

11

検索と順序付けに、アクセントを区別しない照合を使用しようとしました。

http://dev.mysql.com/doc/refman/5.0/en/charset-collat​​ion-implementations.html

問題は、NAME列が latin1 (8 ビット) 文字セットに格納されているように見えることです。そのため、mySQL は次のように不平を言っています。

  COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

試してみると、あなたが望む結果が得られるかもしれません

 WHERE CONVERT(p.NAME USING utf8) LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

しかし、注意してください!

WHERE ステートメントの列で何らかの関数 (この例では CONVERT) を使用すると、インデックスを使用して検索を最適化しようとする MySQL の試みが無効になります。このプロジェクトが大きくなる場合 (つまり、テーブルに多数の行がある場合)、latin1 ではなく utf8 形式でデータを保存する必要があります。LIKE '%whatever%'(おそらく、検索用語が MySQL のインデックス作成にも無効であることは既にご存じでしょう。)

于 2012-05-31T11:44:27.887 に答える