22 May 2008

PHP + MySQL + UTF-8 文字化けの回避

PHPでMySQLに格納された日本語データを読み書きする時に、文字化けが起きる時の解決方法。

MySQLの環境 : MySQL 5.0.45、標準文字コード UTF-8
PHPの環境 : PHP 5.2.4
Apacheに格納するphpファイルのエンコード : Shift JIS (Windowsで編集)

phpMyAdminでは、UTF-8で格納された文字列以外は、文字化けして画面に表示できない。
WindowsのOpenOffice.org Base から書き込んだ文字列は、自動で UTF-8 形式に変換されている。

PHPで、何の設定も行わずに読み書きすると、Shift JIS モードとなっている。 UTF-8のデータを読み出すと文字化けする。また、Shift JISで書き込まれた文字列は他のソフトから読み出すと文字化けしている。

解決方法

PHPの文字コードをShift JISに強制設定
PHPでクエリに出す”文字列”は明示的にUTF-8に変換
MySQLの文字コードの環境変数を変更する


<?php

mb_language('Japanese');
mb_internal_encoding('Shift_JIS');
mb_http_output('Shift_JIS');


// MySQL 接続
if (!($cn = mysql_connect("localhost:3306", "testuser", "test"))) {
die;
}

mysql_query("SET NAMES utf8",$cn);

// MySQL DB 選択
if (!(mysql_select_db("test"))) {
die;
}

// MySQL 問い合わせ
$sTmp = mb_convert_encoding("試験データ", "UTF-8");
$sql = "insert into TBL_MAIN (mode, date, time, data_str) values(1, '2008-05-05', '13:45:20', '" . $sTmp . "')";
if (mysql_query($sql) != TRUE) {
die;
}

// MySQL 切断
mysql_close($cn);

?>

この方法が本当にあっているかどうかは知らないが、今のところうまく行っている…