「パパイヤ」「ハハイヤ」はまったく違うので濁音や半濁音を区別して検索する方法を知りたいです。「
MySQLで部分一致検索をするときにたまに出くわすのがこの問題です。
今回は「濁音や半濁音を区別した部分一致検索」をする方法を紹介します。
【環境】
MySQL 5.6
MySQLで濁点・半濁点を区別して部分一致検索を行う必要があった
部分一致の検索ですぐに思う浮かぶのが「LIKE検索」だと思います。
しかしMySQLのLIKE検索では濁点や半濁点は区別しません。
例えば以下のSQLを検索した場合は「カルビ」も「カルピス」も抽出されます。
SELECT * FROM ng_words 'カルビ' like concat('%', ng_words.word, '%');
カルビとカルピスとかまじで全然違いますよね。
日本語は1文字違うだけでかなり意味が変わってしまう言葉がたくさんあります。
そうなると言語の部分一致検索がゆるいと思わぬバグを生んでしまうこともあるのです。
僕もその対応に迫られたので対処方法を記しておきます
【結論】BINARY検索で手軽におこなう
以下のコードだと濁点や半濁点を区別してくれます。
ただしカタカナとひらがなも区別されるので注意です。
あくまでバイナリの比較になります。
SELECT * FROM ng_words 'カルビ' like BINARY concat('%', ng_words.word, '%');
つまり上記の検索の場合は「カルピス」もひっかかりませんし、「かるび」もひっかかりません。
正確に抽出したい場合はBINARYでOK
濁点は区別したいけど、ひらがな・カタカナは区別したいなんて場合は他の手段を取る必要があります。
しかし正確に抽出したい場合はBINARYでOKかなと思います。
今回は以上です。