Category: "MySQL, Oracle, データベース" , Tags: binary, MySQL, varchar, ケース非依存, 大文字小文字
しゃちょーです。
じゃんじゃんいきます。
今回もMySQLの超初心者Tips。
今回のネタは、MySQL自身がドキュメントでそう謳っているので仕様なんだけど、Oracle技術者の人にはあり得ない仕様らしくて、まさかそれがオプションだと思っていない人が多いので。
そんなこと言ったって仕様は仕様でしょ?しょうがないじゃん。
公式ドキュメントをちゃんと読めばわかるんだけど、みんな読まないよね。
気持ちわかりますよ。(でも読んだ方がいいよ)
その2:varchar型のカラムで大文字小文字が区別されない(検索時のケース非依存)
これはほぼ毎回聞かれるね。
MySQLのドキュメントでは「検索時のケース依存」(Case Sensitivity in Searches)という言い方をしている。
あまりにFAQなのでまさかと思って自分からは言わないが、
テストに入ったあたりで、
「where句に指定した文字列が大文字小文字の別なくマッチするんですけど、まさかMySQLって大文字小文字の区別しないんじゃないでしょうね?」
てな感じでさも私が作ったものであるかのように詰問される。
「binary属性つけてください」
char型も同じですから。
これから作るなら
Create Table テーブル名 (カラム名 varchar(n) BINARY);
もう作り直せないってなら
Alter Table テーブル名 MODIFY カラム名 varchar(n) BINARY;
以下はOracle技術者向けの例。
– col1をbinary属性付きで、col2をデフォルトのままでテーブルを作成
mysql> Create Table tab1 (col1 varchar(10) BINARY, col2 varchar(10));
Query OK, 0 rows affected (0.19 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tab1 |
+----------------+
1 rows in set (0.00 sec)
– 全件取得
mysql> select * from tab1;
+------+------+
| col1 | col2 |
+------+------+
| aaa | BBB |
+------+------+
1 row in set (0.00 sec)
– col1(binary属性付き)を大文字小文字を意識して条件検索
mysql> select * from tab1 where col1 = 'AAA';
Empty set (0.00 sec)
– 0件取得。Oracle技術者はこの結果を望んでいる
– 次にcol2(binary属性無し)を大文字小文字を意識して条件検索
mysql> select * from tab1 where col2 = 'bbb';
+------+------+
| col1 | col2 |
+------+------+
| aaa | BBB |
+------+------+
1 row in set (0.00 sec)
– 1件取得
– しかし、テーブルに入っている文字列と、条件の文字列は大文字小文字が異なっている
– Oracle技術者にとってこの結果は致命的に「MySQLだめじゃん」って言われることの一つ
– しょうがないのでAlter Tableでbinary属性つけてみる
mysql> Alter Table tab1 MODIFY col2 varchar(10) BINARY;
Query OK, 1 row affected (0.48 sec)
Records: 1 Duplicates: 0 Warnings: 0
– さっきのと同じ条件で再度検索
mysql> select * from tab1 where col2 = 'bbb';
Empty set (0.00 sec)
– こちらの結果でよろしかったですか?(と居酒屋的過去形で聞いてみる…)
ちなみに、binary属性を付けたときと付けないときのCreate Table文がMySQL的にはどういうSQL
になっているか、ぜひ「show create table テーブル名」で確認してみてほしい。
MySQL的にはこれが本来の私ども向けのSQLです、ってのが表示されるはず。


