現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

DBから取得した値の大文字小文字を区別する

f:id:jsaz:20170122231945j:plain
パスワードやコードをユーザーに発行する場合、
文字の大文字小文字を区別したいときがあるかと思います。

今回はPHPMySQLで作るシステムで考えてきましょう。

カラムの設定が必要となる

通常、文字列の型のカラムに対して
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|

結果、各データ大文字小文字関係なく全部対象となってしまいます。
これでは正確に条件に当てはまったデータを取得できません。


MySQLで大文字小文字を区別するにはバイナリ属性を設定する必要があります。


既存のテーブルのカラムを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属性にする必要がある