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.区別した場合のパフォーマンスが低下する可能性がある


こんな感じかな