7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Unicode正規化とMySQLとPHPとMac OS X

Last updated at Posted at 2014-04-14

#背景
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を投げ捨てるのも一考である。

7
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?