やきにくとくにきや

WEBサービスとイベントに夢見るエンジニアの技術メモ、チラシの裏。そして焼肉たべたい

phpMyAdminが文字化けする

   

PHP+MySQLで開発の際は文字コードをUTF-8に統一しているのですが、
何故かphpMyAdminで日本語が化ける…

ネットで調べていくつかやってみました。

因みに環境はこちら
CeontOS5.6
PHP5.1.6
MySQL5.0.77
phpMyAdmin2.11.11.3

対策1.
PHPの内部文字コード設定

php_value default_charset            UTF-8
php_value mbstring.internal_encoding UTF-8
php_value mbstring.script_encoding   UTF-8
php_value mbstring.http_output       UTF-8

対策2.
MySQLの文字コード設定

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
default-character-set = utf8
skip-character-set-client-handshake
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8

対策3.
phpMyAdminの文字コード設定

config.inc.phpに

$cfg['DefaultLang'] = 'ja-utf-8';
$cfg['DefaultCharset'] = 'utf-8';

対策4.
DBのテーブル毎の文字セットを設定する。

今回はutf8_general_ciに統一。

結果。。。

解決せず…

最終的に解決した対策はこちら
http://ma-bank.com/item/643

phpMyAdmin/libraries/database_interface.lib.phpの820行付近にある
function PMA_DBI_postConnectを書き換える。

function PMA_DBI_postConnect($link, $is_controluser = false)
{
if (!defined('PMA_MYSQL_INT_VERSION')) {
$mysql_version = PMA_DBI_fetch_value(
'SELECT VERSION()', 0, 0, $link, PMA_DBI_QUERY_STORE);
if ($mysql_version) {
$match = explode('.', $mysql_version);
define('PMA_MYSQL_INT_VERSION',
(int) sprintf('%d%02d%02d', $match[0], $match[1],
intval($match[2])));
define('PMA_MYSQL_STR_VERSION', $mysql_version);
unset($mysql_version, $match);
} else {
define('PMA_MYSQL_INT_VERSION', 32332);
define('PMA_MYSQL_STR_VERSION', '3.23.32');
}
}
if (!defined('PMA_ENGINE_KEYWORD')) {
if (PMA_MYSQL_INT_VERSION >= 40102) {
define('PMA_ENGINE_KEYWORD','ENGINE');
} else {
define('PMA_ENGINE_KEYWORD','TYPE');
}
}
if (PMA_MYSQL_INT_VERSION >= 40100) {
// If $lang is defined and we are on MySQL >= 4.1.x,
// we auto-switch the lang to its UTF-8 version (if it exists and user
// didn't force language)
if (!empty($GLOBALS['lang'])
&& (substr($GLOBALS['lang'], -5) != 'utf-8')
&& !isset($GLOBALS['cfg']['Lang'])) {
$lang_utf_8_version =
substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-'))
. '-utf-8';
if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
$GLOBALS['lang'] = $lang_utf_8_version;
$GLOBALS['charset'] = 'utf-8';
define('PMA_LANG_RELOAD', 1);
}
}
// and we remove the non-UTF-8 choices to avoid confusion
// (unless there is a forced language)
if (!defined('PMA_REMOVED_NON_UTF_8') && ! isset($GLOBALS['cfg']['Lang'])) {
foreach ($GLOBALS['available_languages'] as $each_lang => $dummy) {
if (substr($each_lang, -5) != 'utf-8') {
unset($GLOBALS['available_languages'][$each_lang]);
}
}
define('PMA_REMOVED_NON_UTF_8', 1);
}
$mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
if ($is_controluser
|| empty($GLOBALS['collation_connection'])
|| (strpos($GLOBALS['collation_connection'], '_')
? substr($GLOBALS['collation_connection'], 0, strpos($GLOBALS['collation_connection'], '_'))
: $GLOBALS['collation_connection']) == $mysql_charset) {
PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link,
PMA_DBI_QUERY_STORE);
} else {
PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link,
PMA_DBI_QUERY_STORE);
}
if (!empty($GLOBALS['collation_connection'])) {
PMA_DBI_query('SET collation_connection = \'' . $GLOBALS['collation_connection'] . '\';',
$link, PMA_DBI_QUERY_STORE);
}
if (!$is_controluser) {
$GLOBALS['collation_connection'] = PMA_DBI_get_variable('collation_connection',
PMA_DBI_GETVAR_SESSION, $link);
$GLOBALS['charset_connection']   = PMA_DBI_get_variable('character_set_connection',
PMA_DBI_GETVAR_SESSION, $link);
}
// Add some field types to the list, this needs to be done once per session!
if (!in_array('BINARY', $GLOBALS['cfg']['ColumnTypes'])) {
$GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
}
if (!in_array('VARBINARY', $GLOBALS['cfg']['ColumnTypes'])) {
$GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';
}
} else {
require_once './libraries/charset_conversion.lib.php';
}
}

から以下へ

function PMA_DBI_postConnect($link, $is_controluser = false) {
  require_once('./libraries/charset_conversion.lib.php');
}

参考:
http://d.hatena.ne.jp/do-low/20090325/1237950871
http://studyroom.g.hatena.ne.jp/pha/20080309/p2

 - PHP, 管理ツール