裏紙に書く程度の内容

Linuxのphpからmssqlへ接続する際の文字化け

linuxサーバのphpからMicrosoft SQL Serverへ接続する際の文字コードとたわむれたため、そのメモ。

問題となる状況

SQLServer 側は文字コード”SJIS”でデータが格納されている状態。

PHPから接続する際、PDO_SQLSRVで接続すれば問題ないんだけど、これはwindows専用。

今回の環境ではMssql関数を使って接続している。

この時取得したデータをそのまま表示すると文字化けします。

小手先による修正

FreeTDSとやらを使うのが一般的のようだけど、なにやら手間がかかりそうなので、PHPのみで小手先の修正をする。

mb_language("Japanese");
mb_convert_variables('UTF-8', 'SJIS-win', $data);

取得したデータ$datamb_convert_variablesで文字コード変換するだけ。

とりあえず表示だけならこれで問題なかった。

登録とかする場合は逆にすればいいわけで、

mb_convert_variables('SJIS-win', 'UTF-8', $data);

でOK。

フレームワークで問題発生

とりあえず上記で作り込んでいったんだけど、フレームワーク(CodeIgniter使用)でうまくいかない箇所が出てきた。

like検索をする際、うまくいかない文字があるのだ。
発見したのは”ダ”。

likeの条件にこれがあると何も検索されなくなるという感じ。

フレームワークから生成されるSQLを見ると、

"(カラム名)" LIKE '%�!_%' ESCAPE '!'

となっていた。

条件データはSJISに変換した状態。(PHPはUTF-8なので文字化けしている)

問題は見てのとおりESCAPE '!'。”ダ”という文字内の”!”もエスケープされてしまう。

これがNGで、全体的実装を見直すことになった。

FreeTDSをいれる

FreeTDSのインストール・設定は
Linux PHPからSQL Serverに接続
がわかりやすかった。

横着しないで最初からきちんとすればよかった。

広告
Index
広告