xai1981's blog

http://twitter.com/xai1981

MySQL_データの大文字小文字の区別

あるテーブルで大文字・小文字の区別したいと要望がありました。同じ文字列で大文字・小文字のそれぞれデータのインサートを許容して欲しいそうです。

現状のテーブル構造

mysql> desc sites;
+------------+----------------------+------+-----+-------------------+-------+
| Field      | Type                 | Null | Key | Default           | Extra |
+------------+----------------------+------+-----+-------------------+-------+
| id         | int(10) unsigned     | NO   | PRI | NULL              |       |
| name       | varchar(1000)        | NO   |     | NULL              |       |
| url        | varchar(255)         | NO   | UNI | NULL              |       |
| type       | enum('recruit','ad') | NO   |     | NULL              |       |
| created_at | timestamp            | NO   |     | CURRENT_TIMESTAMP |       |
| updated_at | timestamp            | YES  |     | NULL              |       |
+------------+----------------------+------+-----+-------------------+-------+
6 rows in set (0.00 sec)

jpとJpの違いがるデータのインサート

mysql> INSERT INTO sites (id, name, url, type, created_at)  VALUES (13, 'a01', 'http://www.goo.ne.jp', 'ad', now());
ERROR 1062 (23000): Duplicate entry 'http://www.goo.ne.jp' for key 'sites_url_unique'
mysql> INSERT INTO sites (id, name, url, type, created_at)  VALUES (13, 'a01', 'http://www.goo.ne.jP', 'ad', now());
ERROR 1062 (23000): Duplicate entry 'http://www.goo.ne.jP' for key 'sites_url_unique'

このままではインサートできませんでした。 該当フィールドにBINARY属性を付与します。

mysql> ALTER TABLE sites MODIFY url VARCHAR(255) BINARY;
Query OK, 12 rows affected (0.21 sec)
Records: 12  Duplicates: 0  Warnings: 0

Jpのデータをインサート

mysql> INSERT INTO sites (id, name, url, type, created_at)  VALUES (13, 'a01', 'http://www.goo.ne.jP', 'ad', now());

jp、Jpの違いのあるデータが無事に入りました。

mysql> select * from sites;
+----+--------------------------------+---------------------------------+---------+---------------------+---------------------+
| id | name                           | url                             | type    | created_at          | updated_at          |
+----+--------------------------------+---------------------------------+---------+---------------------+---------------------+
| ...
| 12 | a01                            | http://www.goo.ne.jp            | ad      | 2016-01-31 16:59:13 | NULL                |
| 13 | a01                            | http://www.goo.ne.jP            | ad      | 2016-01-31 17:15:05 | NULL                |
+----+--------------------------------+---------------------------------+---------+---------------------+---------------------+
13 rows in set (0.00 sec)

mysql> select * from sites where url = 'http://www.goo.ne.jp';
+----+------+----------------------+------+---------------------+------------+
| id | name | url                  | type | created_at          | updated_at |
+----+------+----------------------+------+---------------------+------------+
| 12 | a01  | http://www.goo.ne.jp | ad   | 2016-01-31 16:59:13 | NULL       |
+----+------+----------------------+------+---------------------+------------+
1 row in set (0.00 sec)

mysql> select * from sites where url = 'http://www.goo.ne.jP';
+----+------+----------------------+------+---------------------+------------+
| id | name | url                  | type | created_at          | updated_at |
+----+------+----------------------+------+---------------------+------------+
| 13 | a01  | http://www.goo.ne.jP | ad   | 2016-01-31 17:15:05 | NULL       |
+----+------+----------------------+------+---------------------+------------+
1 row in set (0.00 sec)
参考サイト