MySQLであいまい検索! LIKE検索で濁点、半濁点を区別する方法
目次
こんにちは! 西村です。
MySQLを使用して検索機能を作成した際、濁点、半濁点を区別して検索をする必要がありました。その時、実践した解決方法を紹介いたします。MySQLのバージョンは下記になります。
- MySQL
- 8.0
MySQLのあいまい検索
MySQLではデフォルトの設定でLIKE検索を行うと濁点と半濁点の区別を行いません。例えば下記のようなtableからLIKE検索するとします。
id | name |
---|---|
1 | タイヤ |
2 | タイ |
3 | ダイヤ |
4 | イヤリング |
SELECT * FROM test WHERE name LIKE %タイ%;
こちらのSQLだと、結果は下記になります。
id | name |
---|---|
1 | タイヤ |
2 | タイ |
3 | ダイヤ |
タイヤの「タイ」とタイの「タイ」、ダイヤの「ダイ」も条件に含まれています。ここから濁点を含むダイヤを条件から外す必要があります。
方法1:BINARY演算子
BINARY演算子を使用する方法です。
SELECT * FROM test WHERE sample LIKE BINARY %タイ%;
MySQL 8.0 リファレンスマニュアルにはBINARY 演算子について下記のように書かれています。
BINARY 演算子は、式をバイナリ文字列 (binary 文字セットおよび binary 照合順序を持つ文字列) に変換します。 BINARY の一般的な用途は、文字単位ではなく数値バイト値を使用して、文字列をバイト単位で強制的に比較することです。
MySQL 8.0 リファレンスマニュアルより引用
検索対象を文字列単位ではなくバイト単位で比較することで、濁点と半濁点の区別ができるようになるようです。
注意点としては。文字コードが完全に同一でないと正確な検索を行えません。濁点、半濁点の区別のためであれば今回の方法で対応可能です。
方法2:MySQLの照合順序
MySQLには照合順序というものが設定されています。照合順序とは簡単に説明すると文字の大小比較をする際の基準になるもののことです。
MySQLでは照合順序に utf8_general_ci( utf8mb4_general_ci )を指定することで、ひらがな・カタカナ、濁音・半濁音をすべて区別するように設定できます。
ALTER DATABASE データベース名 COLLATE utf8_general_ci
MySQLでは照合順序を設定する場合は、詳細に区別してくれるutf8_general_ciもしくはutf8mb4_binを適用することが推奨です。
collations | 説明 |
---|---|
utf8_general_ci | アルファベットの大文字小文字と絵文字の区別を行わない。その他の区別はすべて行う。 |
utf8mb4_bin | アルファベットの大文字小文字の区別を行わない。その他の区別はすべて行う。 |
まとめ
MySQLのLIKE検索で濁点、半濁点を判別して検索する方法をご紹介しました。
MySQLの照合順序についてはまた別の機会に紹介したいと思います。今回紹介させていただいた内容が、皆様の役に立てると嬉しいです。
《関連記事》