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;
みたいな感じで変更可能です。
(^_^;)