いままで iモードID(guid, 個体識別番号)は大文字・小文字の区別ありなことを意識していなかった
いわゆる、かんたんログインと呼ばれる認証方法をドコモ端末で実装するときにつかわれていると思われるiモードIDですが、大文字・小文字の区別あり、だということを今日初めて知りました。
以下、問題になった部分の最小構成。かんたんログインの是非はいったん置いておきます。
CREATE TABLE `user` ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, mobile_id VARCHAR(255) NOT NULL, PRIMARY KEY(id), UNIQUE INDEX user_mobile_id(mobile_id) );
INSERT INTO `user` (mobile_id) VALUES('xx0000x'); -- => Query OK, 1 row affected (0.06 sec) INSERT INTO `user` (mobile_id) VALUES('xx0000X'); -- => ERROR 1062 (23000): Duplicate entry 'xx0000X' for key 2
case in sensitive !!
ALTER TABLE `user` MODIFY COLUMN mobile_id VARCHAR(255) BINARY NOT NULL;
して、
INSERT INTO `user` (mobile_id) VALUES('xx0000X'); -- => Query OK, 1 row affected (0.00 sec) SELECT * FROM user; -- => -- +----+-----------+ -- | id | mobile_id | -- +----+-----------+ -- | 1 | xx0000x | -- | 2 | xx0000X | -- +----+-----------+ -- 2 rows in set (0.00 sec)
iモードID xx0000x でアクセスして来た人に xx0000X の人のページを表示してしまう可能性があった。
そのうちおこる可能性はあったなあ。気をつけないと。勉強になりました。
2009/08/06修正
一回目のインサート 'xx0000X' -> 'xx0000x'