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・・・などアルファベットを使用するケースが
出てくると思います
しかもそういったものに限って重要なカラムだったり・・・。
というときに失敗しないように大文字・小文字を区別する方法の紹介でした