さくらインターネットスタンダードプランmysqlの文字コードの扱い(utf8, euc-jp)

mysql中の日本語データをphpで出力した際、文字コードがeuc-jpになってしまっていたので、その対処法のメモ。
文字コードはデータベースを作るときに、utf8_general_ciを指定していたのでまずは文字コードの確認。

文字コード確認

mysqlでテーブルに入ってから

mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | ujis                             |
| character_set_connection | ujis                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | ujis                             |
| character_set_server     | ujis                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

character_set_databaseはutf8だがclientやconnectionはujis(euc-jp)になってしまっている。
どうやらさくらインターネットスタンダードプランの仕様らしい。
http://wanizakki.seesaa.net/article/147630193.html
この情報によると、テーブルをエクスポートして設定を変えることにより対処できるようだが、かなりややこしい。
php側で対処することにした。

phpコード

$mysqli->set_charset(‘utf8’);
ではなく
mysqli_set_charset($mysqli, “utf8”);
を使用する。

$mysqli = new mysqli($db_sever, $user_name, $password, $db_name);
if (mysqli_connect_error()) {
	die('Connect Error (' . mysqli_connect_errno() . ') '
		. mysqli_connect_error());
}
mysqli_set_charset($mysqli, "utf8");

if ($result = $mysqli->query("SELECT id FROM " .$table_name)) {
    while ($row = $result->fetch_assoc()) {
        echo $row["id"] . PHP_EOL ;
    }
    $result->close();
}

これでクライアント側でもutf8の文字コードでデータが受け取れる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする