Command disabled: index


̃Gg[͂ĂȃubN}[Nɒlj

MySQL :: 大文字小文字の区別



MySQL の char, varchar 型のカラムを検索対象にする時は要注意。
何も考えずに CREATE TABLE してしまうと、大文字小文字の区別が無い型になってしまう。
詳しくは、以下の例を参照。

普通に CREATE TABLE する
CREATE TABLE main_table (
 user_id int NOT NULL  auto_increment,
 product_id char(128) NOT NULL,
 PRIMARY KEY (user_id),
 KEY idx_product_id (product_id)
) TYPE=InnoDB;
適当にレコードを insert して select する
mysql> select * from main_table;
+---------+------------+
| user_id | product_id |
+---------+------------+
|       1 | a          |
|       2 | A          |
|       3 | b          |
|       4 | B          |
|       5 | c          |
|       6 | C          |
+---------+------------+
6 rows in set (0.00 sec)
上記のようなレコードがある前提で、以下の SQL を実行する
mysql> select * from main_table where product_id='a' or product_id='c';
+---------+------------+
| user_id | product_id |
+---------+------------+
|       1 | a          |
|       2 | A          |
|       5 | c          |
|       6 | C          |
+---------+------------+
6 rows in set (0.00 sec)

小文字の `a' と `c' だけヒットしてほしいのに、大文字の `A' と `C' までヒットした。



回避方法は下記参照。キーワードは「binary」属性。



「binary」属性をつけて CREATE TABLE する
  • char(128) binary に注目
CREATE TABLE main_table (
 user_id int NOT NULL  auto_increment,
 product_id char(128) binary NOT NULL,
 PRIMARY KEY (user_id),
 KEY idx_product_id (product_id)
) TYPE=InnoDB;
今度は期待通りの結果を得た
mysql> select * from main_table where product_id='a' or product_id='c';
+---------+------------+
| user_id | product_id |
+---------+------------+
|       1 | a          |
|       5 | c          |
+---------+------------+
3 rows in set (0.00 sec)

小文字の `a' と `c' だけヒット。




database/mysql/setup/nocase.txt