DBから取得した値の大文字小文字を区別する
パスワードやコードをユーザーに発行する場合、
文字の大文字小文字を区別したいときがあるかと思います。
カラムの設定が必要となる
通常、文字列の型のカラムに対して
WHEREなどで条件検索した場合、
大文字小文字は区別してくれません。
このようなt_codeというテーブルがあったとします。
id | code |
10 | WordPress |
11 | wordpress |
12 | WORDPRESS |
キャメルケースの「WordPress」というレコードを取得したいのでSELECTで抽出してみます。
SELECT * FROM `t_code` WHERE code = 'WordPress'; ------ | id| code | | 10| WordPress| | 11| wordpress| | 12| WORDPRESS|
結果、各データ大文字小文字関係なく全部対象となってしまいます。
これでは正確に条件に当てはまったデータを取得できません。
既存のテーブルのカラムをbinary属性に変更する
先ほどのt_codeテーブルのカラム「code」に対してテーブルの構造を変更してみます。
ALTER TABLE `t_code` CHANGE `code` `code` VARCHAR( 3 ) BINARY CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'コード';
上記は既存のテーブルの構造を変更するためにALTER TABLEを使っていますが、テーブルを作成するとき(CREATE)でも設定することは可能です。
WHERE句で確認
早速、binary属性に変更したテーブルに対して
「WordPress」のレコードを検索してみます。
SELECT * FROM `t_code` WHERE code = 'WordPress'; ------ | id| code | | 10| WordPress|
もちろん全部小文字の「wordpress」でも抽出できます。
SELECT * FROM `t_code` WHERE code = 'wordpress'; ------ | id| code | | 11| wordpress|
想定通り大文字小文字を区別してレコードを取得することができました。
なおphpMyAdminでは、構造-対象カラムの変更から属性の中のBINARYを選ぶことでも設定できるようです。
まとめ
MySQLで大文字小文字を区別するにはbinary属性にする必要がある