文字セットがutf8mb4のあるテーブルに対して
全文検索(MATCH~AGAINST~構文)を行いたいのですが、4バイト文字がヒットしてくれません。
ヒットさせるにはどうすればよいでしょうか。
何かご存じの方、お力添えお願いいたします。
環境
MySQLのバージョンは5.6.17です。
MroongaやGroongaは使用しておらず、
MeCabで形態素解析を行った日本語をスペース区切りでINSERTしています。
(直接関係ない気がしますが、MeCabのバージョンは0.996です)
テーブル(「foo」とします)の設定:
- MyISAM
- 照合順序はutf8mb4_general_ci
- 検索対象フィールド「bar」を持つ
(text型、照合順序はutf8mb4_unicode_ci)
試したこと
もちろんINSERTやSELECTは問題ないことは確認済みで、
LIKE検索もできていました。
sql
1-- `foo`.`bar`に「????」という値をもつレコードがあるとします 2 3-- LIKE検索:ヒットする 4SELECT * FROM `foo` WHERE `bar` LIKE '%????%' 5 6-- MATCH~AGAINST検索①:ヒットしない 7-- (4バイト文字でなければヒットすることも確認済みです) 8SELECT * FROM `foo` WHERE MATCH(`bar`) AGAINST ('+????' IN BOOLEAN MODE) 9 10-- MATCH~AGAINST検索②:ヒットしない 11-- 実際に用いたい構文は↑ですが、こちらでもNGでした 12SELECT * FROM `foo` WHERE MATCH(`bar`) AGAINST ('????')
<追記>
「なんとなく思っただけ」レベルなのですが…
そういえば文字セットやバイト数に関係なく、記号類は同じくヒットしない状態なので、
4バイト文字もそのように扱われているのでは…とも思いました。
(これも環境など何か影響している可能性がありますが)
sql
1-- `foo`.`bar`に「☆」という値をもつレコードがあるとします 2 3-- LIKE検索:ヒットする 4SELECT * FROM `foo` WHERE `bar` LIKE '%☆%' 5 6-- MATCH~AGAINST検索:ヒットしない 7SELECT * FROM `foo` WHERE MATCH(`bar`) AGAINST ('+☆' IN BOOLEAN MODE)