MySQL5.7 大文字小文字を区別して検索する方法

今回はMySQLの大文字・小文字の区別について紹介します

MySQLは大文字・小文字を区別しない

MySQLの大文字、小文字ですがOracleと違って
単純なSELECT文では大文字・小文字を区別しません

データの中身が以下のような場合で

mysql> select * From upperlower;
+----+------+
| id | name |
+----+------+
|  1 | test |
|  2 | Test |
|  3 | TEST |
|  4 | tesT |
+----+------+

単純なwhere句指定でSELECT文を実行すると

SELECT * FROM upperlower WHERE name = "test";

結果はこのようになります

mysql> SELECT * FROM upperlower WHERE name = "test";
+----+------+
| id | name |
+----+------+
|  1 | test |
|  2 | Test |
|  3 | TEST |
|  4 | tesT |
+----+------+

区別してくれよーって感じですがMySQLはそうはいかないんですね…

MySQLでこういった場合2つのアプローチがあります

  • BINARY型でカラムを作成しておく
  • VARCHAR型カラムに対してはBinary演算子をつかって検索をする

ただ一般的に文字列=VARCHAR型でカラムを使っているケースが多いです
なので今回は検索する際のBINARY演算子のみ後述していこうと思います

等価 = の比較で区別する

where句の=イコールで区別する場合は
項目名の前にBINARYを付けます

SELECT * FROM upperlower WHERE BINARY name = "test";
mysql> SELECT * FROM upperlower WHERE BINARY name = "test";
+----+------+
| id | name |
+----+------+
|  1 | test |
+----+------+

対象の1件だけ取得することができました

あいまい LIKE の比較で区別する

LIKEをつかったあいまい検索時の区別方法です
こちらも=イコールのときと同様で
項目名の前にBINARYを付けるだけです

SELECT * FROM upperlower WHERE BINARY name LIKE "%T";
mysql> SELECT * FROM upperlower WHERE BINARY name LIKE "%T";
+----+------+
| id | name |
+----+------+
|  3 | TEST |
|  4 | tesT |
+----+------+

LIKEをつかったあいまい検索でも、大文字小文字が区別されました

まとめ

大文字・小文字を意識するのは特にアルファベットを使う場面ですが
アカウントID、Email、url・・・などアルファベットを使用するケースが
出てくると思います

しかもそういったものに限って重要なカラムだったり・・・。

というときに失敗しないように大文字・小文字を区別する方法の紹介でした