19

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

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

エラー 1253 (42000): 照合 'utf8_general_ci' は、CHARACTER SET 'latin1' に対して有効ではありません

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

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

私はSQLにかなり慣れていないので、誰かが助けてくれるかどうか疑問に思っていました.

4

4 に答える 4

41

MySQL の文字列には、文字セットと照合があります。Utf8 は文字セットで、utf8_bin はその照合順序の 1 つです。文字列リテラルを 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 ... 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'
于 2009-05-23T07:55:57.827 に答える
2

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

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

于 2015-12-23T11:22:39.050 に答える
1

SELECT を実行するときに照合順序を明示的に変更する必要がある理由をお尋ねしてもよろしいですか? 並べ替えたときにレコードを取得したい方法で照合しないのはなぜですか?

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

于 2009-05-23T07:52:42.980 に答える