MySQL文字化けの確認(文字コード変換を誰がやる?)
波ダッシュ、全角チルダ、全角ハイフン、半角ハイフンが、「?」になる、文字化けする。
そんなMySQL文字化けの確認。
UTF-8の入力があって、EUCのデータベースに入れる…などの場合に文字コード変換が必要。これをMySQLに任せるか、phpで対応するかが問題。
サンプルコード
<?php //こんな文字列を用意する。文字コードはUTF-8。 $s = '全角マイナス[-]半角マイナス[-]全角ダッシュ[―]全角ハイフン[‐]波ダッシュ[~]半角チルダ[~]全角チルダ[〜]'; //あるサーバーのデータベースtestにて実験 mysql_connect('localhost', 'root'); mysql_select_db('test'); //default charset = utf8 のテーブル、ujis のテーブルを作る mysql_query("drop table if exists t1, t2"); mysql_query("create table t1 (x text) default charset = utf8"); mysql_query("create table t2 (x text) default charset = ujis"); //utf8のテーブルにて実験 //set names utf8; で、これから送るSQLはUTF-8ですよとお知らせする。 //utf8にUTF-8で送るので、特に問題なし mysql_query("set names utf8"); mysql_query("insert into t1 (x) values ('" . addslashes($s) . "')"); $r = mysql_query("select * from t1"); var_dump(mysql_fetch_assoc($r)); //結果:全角マイナス[-]半角マイナス[-]全角ダッシュ[―]全角ハイフン[‐]波ダッシュ[~]半角チルダ[~]全角チルダ[〜] //ujisのテーブルにて実験 //set names utf8; で、これから送るSQLはUTF-8ですよとお知らせする。 //ujisにUTF-8で送る。つまり、MySQLに対応をお願いする。 mysql_query("set names utf8"); mysql_query("insert into t2 (x) values ('" . addslashes($s) . "')"); $r = mysql_query("select * from t2"); var_dump(mysql_fetch_assoc($r)); //結果:全角マイナス[?]半角マイナス[-]全角ダッシュ[―]全角ハイフン[‐]波ダッシュ[?]半角チルダ[~]全角チルダ[〜] //ujisのテーブルにて実験 //set names ujis; で、これから送るSQLはEUCですよとお知らせする。 //ujisにEUCで送る。phpで文字コード変換をした。 mysql_query("truncate t2"); mysql_query("set names ujis"); mysql_query("insert into t2 (x) values ('" . addslashes(mb_convert_encoding($s, 'eucjp-win', 'UTF-8')) . "')"); $r = mysql_query("select * from t2"); var_dump(mysql_fetch_assoc($r)); //結果:全角マイナス[-]半角マイナス[-]全角ダッシュ[―]全角ハイフン[‐]波ダッシュ[~]半角チルダ[~]全角チルダ[~]
まとめ
MySQLの文字コード変換は期待した結果にならないことがある(今後の改善は期待できる?対応する文字コードの追加、カスタマイズはできる?)。MySQLにお任せできないときは、php側で対応すること。
コメント