3

一意のインデックスを持つようにname定義された列を持つデータベース テーブルがあります。VARCHAR(255) COLLATE utf8_unicode_ci名前が含まれています"Grosse"

次のステートメントは行を返しません。

SELECT name FROM authors WHERE name LIKE 'Große' COLLATE 'utf8_unicode_ci'

追加の有無にかかわらず試しましたCOLLATE(おそらく必要ありません)。

次のステートメントは、正しい行を返します。

SELECT name FROM authors WHERE name = 'Große' 

両方のステートメントが行を返すべきではないのに、なぜ異なる結果が得られるのでしょうか?

4

1 に答える 1

1

LIKEOperator は文字ごとに照合を実行します。もちろん、GroßeGrosseは長さが等しくないので、一致することはありません。

試してみるSELECT 'ß' LIKE 'ss' COLLATE 'utf8_unicode_ci'と、'false' (0) が表示されます

試してみるSELECT 'ß' = 'ss' COLLATE 'utf8_unicode_ci'と、「true」が表示されます (1)

ところで、空白にも同じ動作が適用されます。

'x' LIKE 'x 'は一致しませんが、'x'='x '一致します。

=mysqlでは、他のプログラミング言語と同じ意味ではないことに注意してください。mysql では の意味があります。プログラミング言語を模倣したい場合は、バイナリ比較を実行する必要があります: -> false。===.equal()==SELECT BINARY 'ss'='ß'

于 2013-04-12T11:52:35.520 に答える