#背景
Macでファイルパスをindex用にMySQL(innodb)に格納して
select * from hoge where `path` like ?
みたいなことをしたら濁点とかを含むひらがな、カタカナ(ex. アンパンマン)とかを入力しても引っかからない。recordから取得した文字を直接コピペすると引っかかる。みたいな不思議な現象、対策を考えた
#原因
Unicodeの正規化方法が異なっているのが原因。世の中のほとんどはNFCで正規化されているがMacのファイル・ディレクトリ名はNFDで正規化されている
#対策
どこかで正規化方法を統一できればよい
##MySQLで正規化
MySQLで正規化してくれると一番簡単なのですがデフォルトだとそのような機能は備わっていないもよう。utf8_general_ciとかでもダメ。プラグインを入れるとできるらしいが面倒なので他の方法をとることにした
##MySQLを使用するアプリケーション側で最適化
今回はクライアントがPHPなのでPHPで正規化した。mbstringあたりでやってくれると便利なのだがそういった機能はなかった
###PHP intlのインストール
ICUのラッパーらしいが名前が酷い。今回はhomebrewとjosegonzalez/homebrew-phpでPHPをインストールしていたので
install php55-intl
でインストールした。
###ファイルパスをNFC正規化してからinsertするようにする
http://php.net/manual/ja/class.normalizer.php
$path = Normalizer::normalize($path, Normalizer::FORM_C);
// insert path to DB
#感想
Unicode正規化とMacのファイルシステムの話を知っていたのですぐに気付けたが、知らないとすごくハマりそうな問題である。
Unicode正規化ライブラリは主要な処理系(Java, .NET, Ruby, ...)にはあるがマイナーな処理系とかだとない場合もあってそういう時は大変そう。
Linuxオンリーとかで開発するとこの問題は発生しないので、対策が面倒であればMacを投げ捨てるのも一考である。