Go for it!

モーターサイクルと自転車とキャンプの日々。

データベースレコードのcase

職場で話題になったのでメモ。 職場ブログのコピーみたいなもんですいません。

カラムに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]