utf8_binフィールドのMYSQLの大文字と小文字を区別検索
-
05-09-2019 - |
質問
私は、テーブルを作成し、フィールドに一意のインデックスを追加することができるようにするために、のUTF8のに照合を設定します。今私は、大文字小文字を区別しない検索を実行する必要がありますが、私はCOLLATEキーワードでいくつかのクエリを実行し、私が得たときます:
mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
ERROR 1253(42000):COLLATION 'utf8_general_ci' には有効ではありません 文字セット 'latin1の'
mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
ERROR 1267(HY000):照合順序の不正なミックス(utf8_bin、IMPLICIT)と 操作のための(明示的、latin1_general_ci) '='
私はSQLにかなり新しいですので、誰でも助けることができるかと思いまして。
解決
MySQLでの文字列は、キャラクタセットおよび照合。 UTF8文字セットで、utf8_binはその照合順序のいずれかです。 UTF8列リテラル、あなたの文字列を比較するには、_charset表記でそれを前に置くことにより、UTF8に変換します:
_utf8 'Something'
今の照合は、いくつかの文字セットに対してのみ有効です。
:utf8のための大文字の敏感の照合順序は、あなたのように指定することができた、utf8_binているように見えます_utf8 'Something' collate utf8_bin
これらの変換では、クエリが動作するはずます:
select * from page where pageTitle = _utf8 'Something' collate utf8_bin
_charsetプレフィックスは、文字列リテラルで動作します。フィールドの文字セットを変更するには、CONVERT ...使用するとあります。あなたはのように、別の文字セットにPAGETITLEフィールドを変換したい場合に便利です。
select * from page
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'
「TAB」と呼ばれる表に「COL」という名前の列に文字と照合を表示するには、しようとします:
select distinct collation(col), charset(col) from TAB
すべての文字セットと照合順序のリストはで見つけることができます:
show character set
show collation
とUTF8のための有効なすべての照合順序がで見つけることができます:
show collation where charset = 'utf8'
他のヒント
また、「utf8_general_ciの照合」または「latin1_general_ci丁合い」、すなわち「力」、コレート使用した場合のことに注意してください - このように変換、既存の索引の利用から防ぐことができます!これは、パフォーマンスのために将来的にボトルネックになる可能性があります。
その私のために働いて、これを試してみてください
SELECT * UPPER(users
)= UPPER( 'ホセ')はutf8_binを照合name
FROM
私が聞いてもいいですか?なぜ、ソートされたときに、レコードを取得する方法で照合しませんか?
あなたの検索では大文字と小文字が区別されている問題は、あなたがバイナリ照合を持っているということです。一般的な照合順序を使用する代わりに試してみてください。大文字と小文字の区別と照合順序の詳細については、こちらを見て: 文字列で大文字と小文字の区別がの検索