MySQLで、WHERE句でデータの絞り込みをする時に、大文字と小文字を区別して検索したい!!!
WHERE句でデータの絞り込みをする際、「=」、「LIKE」、「IN」などでデータを絞り込むと思います。
そこで、普通に記載してしまうと大文字でも小文字でも関係なくデータが検索されてしまい、意図しないデータが抽出されてしまうことがあります。
今回の記事では、BINARY演算子を使って大文字と小文字を区別して検索する方法について、サンプルコードを使用して解説していきます。
今回使用するテーブルやデータのSQL構文は下記に記載しているので、ご自分の開発環境にコピペして使用してください。
CREATE TABLE user_table
(id int, name varchar(30), address varchar(50))
;
INSERT INTO user_table
(id,name, address)
VALUES
('1','Aoki', 'Aomori'),
('2','Akiyama', 'Akita'),
('3','Iwasaki', 'Iwate'),
('4','Yamada', 'Yamagata'),
('5','Miyauti', 'Miyagi'),
('6','Fukuda', 'Fukushima'),
('7','aoki', 'aomori'),
('8','akiyama', 'akita'),
('9','iwasaki', 'iwate'),
('10','yamada', 'yamagata'),
('11','miyauti', 'miyagi'),
('12','fukuda', 'fukushima')
;
BINARY演算子について
MySQLでは、大文字小文字を区別するための演算子に「BINARY」が用意されています。
BINARY演算子を検索する文字列の前にセットすることで、セットした文字列を大文字小文字を区別して検索することが可能になります。
「BINARY演算子」は、MySQLに準備されている演算子なので、SQLServerでは使用することができません。 SQLServerでは「COLLATE Japanese_CS_AS」を使用します。
私は個人開発でMySQLを使用していて、会社ではSQLServerを使用しているため、「BINARY」と「COLLATE Japanese_CS_AS」の使用でエラーになった経験があります。
SQLServerを使用している方は、下記の記事を参考にしてみてください。
それでは、「=」、「LIKE」、「IN」それぞれでBINARY演算子を使った例を見ていきましょう。
「=」でBINARY演算子を使う
「=」でBINARY演算子を使うには、検索する文字列の前に「BINARY」と記載することで、大文字小文字を区別して検索することが可能です。
まずは、BINARYを指定せず実行してみます。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address = 'Fukushima'
;
【実行結果】
id | name | address |
---|---|---|
6 | Fukuda | Fukushima |
12 | fukuda | fukushima |
大文字を含めて文字列をセットしても、実行結果には大文字小文字関係なくデータが抽出されます。 それでは、BINARYを指定して実行します。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address = BINARY 'Fukushima'
;
【実行結果】
id | name | address |
---|---|---|
6 | Fukuda | Fukushima |
大文字を含むデータのみが抽出されました。
「LIKE」でBINARY演算子を使う
LIKE演算子でも「=」と同様に検索文字列の前に指定することで、検索可能です。
まずは、BINARYを指定しない例です。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address LIKE 'A%'
;
【実行結果】
id | name | address |
---|---|---|
1 | Aoki | Aomori |
2 | Akiyama | Akita |
7 | aoki | aomori |
8 | akiyama | akita |
先頭に大文字の「A」があるものを抽出したかったのですが、小文字のものも含まれてしまっています。
それでは、BINARYを指定してみます。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address LIKE BINARY 'A%'
;
【実行結果】
id | name | address |
---|---|---|
1 | Aoki | Aomori |
2 | Akiyama | Akita |
先頭が大文字の「A」のデータのみが抽出されました。
「IN」でBINARY演算子を使う
IN演算子でも基本は同じですが、書き方を間違えてしまうとエラーになります。
エラーになる例が下記の通りです。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address IN BINARY ('Yamagata','iwate')
;
【実行結果】
エラー
BINARYを記載する位置がおかしいためエラーになってしまっています。
正しくは、下記の通りです。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address IN (BINARY 'Yamagata', 'iwate')
;
【実行結果】
id | name | address |
---|---|---|
4 | Yamada | Yamagata |
9 | iwasaki | iwate |
BINARYを「()括弧」の中に記載することでエラーが解消されます。
INの場合は、BINARYの記載位置に注意が必要です。
まとめ
- BINARYは、大文字小文字を区別するための演算子
- BINARYは、MySQLで使用される演算子
- 検索文字列の前に「BINARY」を記載して使用する
- IN演算子で使用する場合には、「()括弧」の中に記載する