Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL: 知ってた?検索時の大文字、小文字の扱いについて

MySQLでの大文字小文字の値の区別の話って・・・意識しなかったのだけどデフォルトの設定だと区別しない仕様なんですね・・。 ここでいう大文字、小文字の区別とは、任意のテーブルに設定するカラムのCHAR,VARCHAR,TEXT属性のことです。既にMySQLのDBエンジニアさん達は周知の事実らしく・・どうも知らなかったの自分だけかもという悪寒が・・・そんなことも知らなかったの?俺。

ためしにこんなテーブルを作ってみます。 [sql] CREATE TABLE t01 ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, detail varchar(10) DEFAULT NULL COMMENT '文字', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 [/sql] そしてこんなデータをINSERTします。

[sql] insert into t01 (detail) value ('ABCD01'), ('AbCD01'), ('abcd01');

mysql> select  * from t01; +----+--------+ | id | detail | +----+--------+ |  1 | ABCD01 | |  2 | AbCD01 | |  3 | abcd01 | +----+--------+ 3 rows in set (0.00 sec) [/sql]

では、以下のSELECT文を発行した場合どのような結果が戻ってくるか見てみます。

[sql] mysql> select id,detail from t01 where detail like 'AbCd%'; +----+--------+ | id | detail | +----+--------+ |  1 | ABCD01 | |  2 | AbCD01 | |  3 | abcd01 | +----+--------+ 3 rows in set (0.02 sec) [/sql]

お気づきになられましたでしょうか? お気づきになられましたでしょうか?(笑)検索の文字列の大文字、小文字を見ていません。 便利~!!!なわけない(汗 デフォルトで大文字、小文字を区別してくれるのであればいいのに・・なぜ、こんな仕様になっているのか謎です。でも、検索時に大文字、小文字を区別して検索したいという要望のほうが普通に考えれば少ないか・・。

僕的には、大文字、小文字を区別してもらいたい派なので、そういう場合は、どうすればいいのか色々調べてみましたmy.cnfになんか設定あるのか?・・無いよ・・・。

なんとテーブルの定義レベルで変更しないといけないみたいなんです・・。

以下のように定義を変更してみます

[sql]

ALTER TABLE t01

MODIFY COLUMN detail VARCHAR(10) BINARY;

CREATE TABLE t01 ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, detail varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 [/sql]

では、もう一回検索してみます。条件は上記と同じです

[sql] mysql> select id,detail from t01 where detail like 'AbCd%'; Empty set (0.00 sec) [/sql] 検索にヒットしなくなりましたね。大文字、小文字を区別するようになったといったところでしょうか? 本当に、区別するようになったのか再度確認してみます。

[sql] mysql> select id,detail from t01 where detail like 'Ab%'; +----+--------+ | id | detail | +----+--------+ |  2 | AbCD01 | +----+--------+ 1 row in set (0.00 sec) [/sql]

おみごと!!・・でもめんどくさくない?・・・・・。

ちなみに、話はそれますが、MySQLで言っているバイナリって何がバイナリなんでしょうか?・・bin-logもバイナリではないし、上記のDDLだって別にバイナリじゃないし・・・謎です。