フィールドに一意のインデックスを追加できるようにするために、テーブルを作成し、照合順序をtf8に設定しました。次に、大文字と小文字を区別しない検索を実行する必要がありますが、collateキーワードを使用していくつかのクエリを実行すると、次のようになります。
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にかなり慣れていないので、誰か助けてくれないかと思っていました。
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'
これを試してみてください、それは私のために働いています
SELECT * FROM users
WHERE UPPER(name
)= UPPER( 'josé')COLLATE utf8_bin;
また、「Collateutf8_general_ci」または「Collatelatin1_general_ci」、つまり「force」照合を使用する場合、このような変換により既存のインデックスを使用できなくなることに注意してください。これは、将来のパフォーマンスのボトルネックになる可能性があります。
SELECTを実行するときに、照合順序を明示的に変更する必要があるのはなぜですか。並べ替えたときにレコードを取得したい方法で照合してみませんか?
検索で大文字と小文字が区別される場合の問題は、バイナリ照合があることです。代わりに、一般的な照合を使用してみてください。大文字と小文字の区別と照合の詳細については、こちらをご覧ください: 文字列検索での大文字と小文字の区別