2013年3月3日日曜日

[CakePHP]アラビア語はSQLまでも右から左へ受け流す 他

アラビア語をINSERTしたSQL文をブラウザで見るとカラムと値の並びが逆だった

仕事でアラビア語を登録するSQLを実行する機会がありました。
アラビア語を登録するテーブルの構造は以下のような構造。

Field
id
word
delete_flag
created
modified

"word"列にアラビア語がセットされるのですけど、INSERT文をCakePHPにて実行し、Cakeが出力するSQLデバッグを確認したところ・・・



カラムと値の対応が逆になってました。でもテーブル確認するとちゃんと正常にデータ登録されてました。てかブラウザのページソース確認してみると、カラムと値の並びはちゃんと揃ってました。
ちなみに上記テーブルをCSV出力してWindowsのEmEditorで開いた時も並びは逆になってました。

アラビア語といえば右から左へ綴る言語ってことで、ブラウザとかエディタが表示制御してるんでしょうね。SQLに限らず、左から右へと綴る言語とアラビア語を混在させた文章がどう表示されるかいろいろ試してみたいな。ま、それをやって特に得るものはないから優先度超低だけど。

アラビア語の文字コードとかのメモ殴り書き

携わってる仕事は別にグローバルでは無いんですけどね。
  • ISO-8859-6, windows-1256 : アラビア語
  • GB2312 : 中国語
  • EUC-KR : 韓国語
    ※mb_detect_orderで「EUC-JP」の後に定義してると「EUC-JP」と検出されてしまった。
    「EUC-JP」の前に定義すると今度は「EUC-JP」が「EUC-KR」と検出。
    つまりどちらの言語も先に出現する方のエンコーディングとして検出されるっぽい
  • タイ語はUTF-8
グローバル展開するならMySQLのエンコーディングはutf8ではなくutf8mb4を使うべき
【デブサミ2012】16-A-6 レポート グリーに学ぶ、グローバル展開の最新事情 (2/2):CodeZine

CakePHPではMySQLのTINYINT型はboolean型扱いとなる

データの種類や区分を表すのに整数値割り当てて使うってのはまあ当たり前の話ですが・・・
この区分値を格納するカラムの型をTINYINT(1)にし、Modelでこの区分値の条件指定して検索かけたところ、いろいろと意図してない結果が発生しました。
  • 検索条件に2以上の値を指定しても=1のデータが返ってきた
  • 値が0のデータの検索結果をダンプすると、カラムの値は0ではなくbool(false)となっていた
    →PHPで判定条件を「=== 0」と厳密判定にしてたら大変だね
どうも「0とそれ以外」の2種類しか認識されない、つまりboolean扱いされているっぽい。
app/tmp/cache/models配下にあるモデルキャッシュを確認してみたところ、問題のカラムの型は確かにboolean型になってました。
・・・
s:10:"kbn_column";a:4:{s:4:"type";s:7:"boolean";・・・
・・・

Cakeの仕様なんでしょうね。僕全然知らなかったのですけど、これって知ってなきゃ恥ずかしいレベル?

まあとにかく、0と1以外の値を持ちうる場合はCHAR(1)にしときましょう。