mysqlで大文字小文字の区別をしてみる
mysqlって大文字小文字の区別出来ないよねって周りで言っていたので突っ込み入れてみた
テーブルの用意
Field | Type | Null | Key | Default | Extra |
id | int(11) | NO | PRI | NULL | auto_increment |
c1 | varchar(255) | NO | MUL | ||
c2 | text | NO |
例えばこんなデータがあったら
select id,c1 from t1;
1 | aaaaa |
2 | aaaaa |
3 | aaaaa |
4 | aaaaa |
5 | aaaaa |
6 | aaaaa |
7 | aaaaa |
8 | aaaaa |
9 | aaaaa |
10 | AAAAa |
11 | AAAAa |
12 | AAAAa |
13 | AAAAa |
14 | AAAAa |
15 | AAAAa |
16 | AAAAa |
17 | AAAAa |
18 | AAAAa |
19 | AAAAa |
20 | AAAAa |
21 | aaaaa |
22 | aaaaa |
23 | bbbbb |
24 | bbbbb |
25 | bbbbb |
26 | bbbbb |
27 | bbbbb |
28 | ccccc |
29 | ccccc |
30 | ccccc |
31 | ccccc |
32 | ccccc |
33 | ccccc |
これをgroup byしてみる
select c1 from t1 group by c1;
aaaaa |
bbbbb |
ccccc |
確かに区別してない
じゃあhexすればいいじゃん
これをgroup byしてみる
select c1 from t1 group by hex(c1);
AAAAa |
aaaaa |
bbbbb |
ccccc |
ちゃんと出た
explainで確認してみる
explain select c1 from t1 group by hex(c1);
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
1 | SIMPLE | t1 | index | NULL | c1 | 767 | NULL | 33 | Using index; Using temporary; Using filesort |
お、index使ってる!
でもmysqlの場合、関数indexに対応していないのでデータ量が多い場合は厳しいかな
後はbinary型でカラムを作るとかかな
結論
1.「区別出来ない」んじゃないくて「区別してない」
2.区別した場合のパフォーマンスが低下する可能性がある
こんな感じかな