杂七杂八的工作 PhpMyAdmin的乱码解决
jimmy | 05 四月, 2006 16:33
一些历史原因的数据库用Latin1存放GB编码的中文,用PhpMyadmin查看的时候是乱码。下面简单记录一下修改的过程:
下拉选择中文后,查看页面编码还是Unicode的。下拉菜单中的简体中文不解决问题。
查看文件: ../libraries/select_lang.lib.php[line:323]
'zh-gb2312' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh', '中文'),
'zh-utf-8' => array('zh|chinese simplified', 'chinese_simplified-utf-8', 'zh', '中文'),
明明有两个中文选项,为什么只显示了一个呢?
注意到上方说明中:[line:199]
* When there are more than one charset for a language, we put the -utf-8
* last because we need the default charset to be non-utf-8 to avoid
* problems on MySQL < 4.1.x if AllowAnywhereRecoding is FALSE.
全目录搜索-utf-8,查到/libraries/database_interface.lib.php [line:725]
// and we remove the non-UTF-8 choices to avoid confusion
if (!defined('PMA_REMOVED_NON_UTF_8')) {
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);
}
整个注释掉(当然删掉一样啦 :)
还有上面的一段:
// 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';
}
}
自动转化? 咔咔咔!果然不了解中国国情呀。所以说,有时候太傻瓜了也不好。
回到PhpMyAdmin,看一下,页面可以按GB2312编码了。
但是…… 怎么还是乱码呢? 别急,肯定是从数据库取出来的过程中的问题。
接着刚才的处理函数往下看,[line:745]
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);
传输字符集还是用的unicode的。
修改[line:737]为:
//$mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
$mysql_charset = "latin1";
回去看,OK了!
其实还需要再修改一下,配合选择的zh-gb2312 还是 zh-utf-8 来改变连接字符集设定。不过懒得弄了。
再补充一个小技巧: 在左侧目录上直接现实基本信息,对提高工作效率非常有帮助。
其实,PhpMyadmin已经把这个数字取出来了,只是要鼠标放上去才显示,太不方便。改进后对效率没有一点影响,一目了然方便多了。

../left.php [line:520]
echo ' id="icon_' . htmlspecialchars( $table_db . '.' . $table['Name'] ) . '"'
.' width="10" height="10" alt="' . $GLOBALS['strBrowse'] . '" /></a>' . " "
.'<a href="' . $href . '" title="' . $table['Comment']
.' (' . PMA_formatNumber( $table['Rows'], 0 ) . ' ' . $GLOBALS['strRows'] . ')"'
.' id="' . htmlspecialchars( $table_db . '.' . $table['Name'] ) . '">'
. htmlspecialchars( $table['disp_name'] ) . '</a>';
echo '</li>' .' | <font style="background-color: #C0C0C0" color=#FFFFFF>('.htmlspecialchars( $table['Comment'] )." ".PMA_formatNumber( $table['Rows'], 0 ).')</font> '." ";
加粗的那行就是需要改的地方。
~~呵呵~~