LaravelでMySQLのJSON型を使用するとき、データに日本語が含まれているときの注意点をメモしておきます。
Unicodeエンコードされていると、日本語は検索できない
EloquentはJSON型カラムをサポートしています。子要素に対する検索にも対応しています。
しかしながら、日本語などマルチバイト文字はそのままでは検索できないことに注意が必要です。
Unicodeエンコードされていると検索できないので、JSONをデータベースに登録するときは、Unicodeエンコードしないで登録する必要があります。
// NG
{"a":"\u3042"}
// OK
{"a":"あ"}
json_encodeは何のオプションも設定しないと、Unicodeエンコードしてしまいます。また、EloquentからJSONをsaveしたときも、自動的にUnicodeエンコードされてしまうため、検索性に問題が生じます。json_encodeするときは、 JSON_UNESCAPED_UNICODE をオプションに指定するようにします。
json_encode($data, JSON_UNESCAPED_UNICODE)
コメント