MySQLで大文字と小文字が比較されなかった件

UNIQUE KEYを設定しているのに、文字列がUNIQUE判定されないってことがあった。

以前に同じようなことがあったのを、すっかり忘れていたのでもう忘れないようにメモメモ。。。

カラムにTEXT型とかCHAR型とか利用していると思いますが、

文字列を比較するときに実は落とし穴があったりします。

何かというと。。。。

英字の大文字小文字の比較をしてくれません!

こんなものでパスワードを比較した場合、とんでもないことになりますね。

a=A が成立しているということです。

password,paSSword,PassWord,PASSWORD

あいうえおA,あいうえおa

全部同じ文字として処理されます。

検索したときなんか、ユーザーが同じパスワードを設定していた場合

SELECT user, password FROM table WHERE password = "password";

user1,Password

user2,password

こんなことになります。

さて困った。そんな時には、BINARY型を使いましょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.4.2 BINARY および VARBINARY 型

文字列をbinaryとして保存してくれるので、比較の大文字小文字問わず比較してくれます。

ということで、重複を許さないデータはBINARYとして保存しておきましょう。

テーブルを作成してしまった後でも、

ALTER TABLE table MODIFY col TEXT BINARY;

みたいな感じで変更可能です。

(^_^;)