webdevqa.jp.net

utf8_binフィールドのMYSQL大文字と小文字を区別する検索

フィールドに一意のインデックスを追加できるようにするために、テーブルを作成し、照合順序をtf8に設定しました。次に、大文字と小文字を区別しない検索を実行する必要がありますが、collat​​eキーワードを使用していくつかのクエリを実行すると、次のようになります。

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;

エラー1253(42000):COLLATION'utf8_general_ci 'はCHARACTERSET'latin1'に対して無効です

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;

エラー1267(HY000):操作 '='の照合(utf8_bin、IMPLICIT)と(latin1_general_ci、EXPLICIT)の不正な組み合わせ

私はSQLにかなり慣れていないので、誰か助けてくれないかと思っていました。

18
Charlie

MySQLの文字列には 文字セットと照合順序 があります。 Utf8は文字セットであり、utf8_binはその照合順序の1つです。文字列リテラルをutf8列と比較するには、先頭に_charset表記を付けてutf8に変換します。

_utf8 'Something'

現在、照合は一部の文字セットに対してのみ有効です。 utf8の大文字と小文字を区別するsensitive照合順序はutf8_binのように見えます。これは、次のように指定できます。

_utf8 'Something' collate utf8_bin

これらの変換により、クエリは機能するはずです。

select * from page where pageTitle = _utf8 'Something' collate utf8_bin

_charsetプレフィックスは、文字列リテラルで機能します。フィールドの文字セットを変更するには、CONVERT ... USINGがあります。これは、次のように、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'
40
Andomar

これを試してみてください、それは私のために働いています

SELECT * FROM users WHERE UPPER(name)= UPPER( 'josé')COLLATE utf8_bin;

2
user3041121

また、「Collat​​eutf8_general_ci」または「Collat​​elatin1_general_ci」、つまり「force」照合を使用する場合、このような変換により既存のインデックスを使用できなくなることに注意してください。これは、将来のパフォーマンスのボトルネックになる可能性があります。

2
Maksim

SELECTを実行するときに、照合順序を明示的に変更する必要があるのはなぜですか。並べ替えたときにレコードを取得したい方法で照合してみませんか?

検索で大文字と小文字が区別される場合の問題は、バイナリ照合があることです。代わりに、一般的な照合を使用してみてください。大文字と小文字の区別と照合の詳細については、こちらをご覧ください: 文字列検索での大文字と小文字の区別

1