職場で話題になったのでメモ。 職場ブログのコピーみたいなもんですいません。
カラムにINSERTする文字列のcase(大文字小文字のこと)がどのように扱われるか話題になったので、PostgreSQLとMySQLで検証してみた。
[ad#text_only_square]
テスト用のテーブルを作成する。
[code lang=“sql”] CREATE TABLE t_test ( var varchar(40) unique ); [/code]
さてと実験。
PostgreSQLの場合: [code lang=“sql”]
INSERT INTO t_test VALUES(‘aaaaAAAA’);
INSERT 0 1
INSERT INTO t_test VALUES(‘AAAAaaaa’);
INSERT 0 1 [/code]
2レコードとも正常にインサートされる。
MySQLの場合: [code lang=“sql”] mysql> INSERT INTO t_test VALUES(‘aaaaAAAA’); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO t_test VALUES(‘AAAAaaaa’); ERROR 1062 (23000): Duplicate entry ‘AAAAaaaa’ for key 1 [/code]
エエエエェェェェ…。 case insensitiveな扱いとなってduplicate errorとなる。
対応策: MySQLでcase sensitiveに扱うためにはbinary型を使う。
[code lang=“sql”] CREATE TABLE t_test2 ( var binary unique ); [/code]
[code lang=“sql”] mysql> INSERT INTO t_test2 VALUES(‘AAAAaaaa’); Query OK, 1 row affected, 1 warning (0.08 sec)
mysql> INSERT INTO t_test2 VALUES(‘aaaaAAAA’); Query OK, 1 row affected, 1 warning (0.00 sec) [/code]
これで2レコードとも入る。
まとめ:
- PostgreSQLはcase sensitive
- MySQLはcase insensitive
- MySQLでの対処法はbinary型を使う
この対応方法だと、マルチバイト文字を入れた場合にクライアントエンコーディング変換あたりでハマる予感がする。良い解決方法があったら教えて〜。
[ad#text_wide]