SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

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側で対応すること。

関連するメモ

コメント