本文只适合以下版本和数据库的组合
前提1:phpMyAdmin: 2.9.0 以上版本 (all-language)
前提2:MySQL: 4.1.x
-> my.cnf 里面的设置:不使用任何如同 #default-character-set=utf8, 和
#default-character-set=latin1 之类的设置。因此在 Linux shell 下登陆 mysql 后会有如下表示:
# mysql -u root -p前提3:数据库内容是从4.0导入的,并采用 latin1_swedish_ci 作为 数据库校对(collation)和连接校对(MySQL connection collation),其中的数据是通过 GB2312 的 html 进行来写入的。
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 52 to server version: 4.1.14-logType 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> status;
--------------
mysql Ver 14.7 Distrib 4.1.14, for pc-linux-gnu (i686) using EditLine wrapperConnection id: 52
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 4.1.14-log
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /tmp/mysql.sock
Uptime: 20 min 55 secThreads: 1 Questions: 1207 Slow queries: 0 Opens: 34 Flush tables: 1 Open tables: 23 Queries per second avg: 0.962
--------------
乱码原因
我们通常会碰到以下情况:
在phpMyAdmin登陆时(Cookie),选用 "中文 - Chinese simplified (gb2312)"登陆(如下图)。

登陆后,即使将 "MySQL 连接校对" 选择为 "latin1_swedish_ci" ,并把 "Language" 选择为 "中文 - Chinese simplified" 后,却仍然发现页面还是utf-8的 (<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />)。

因此,我们曾经按 latin1 编码储存的 GB2312 的数据,通过 utf-8 的页面显示方式显示的话,必定会是乱码。
解决方法
原理:改变 phpMyAdmin 显示机能,使其用 GB22312 编码显示 html。
修改文件: phpMyAdmin-2.9.2-all-languages/libraries/select_lang.lib.php
341行左右的 available_languages
'zh-gb2312' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh', '中文'),使其在 Language 菜单中显示 GB2312 的一项。
改为
'zh-gb2312-utf-8' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh', '中文'),
当然,如果你不需要中文的显示,可以 comment out 以下一行,
'zh-utf-8' => array('zh|chinese simplified', 'chinese_simplified-utf-8', 'zh', '中文'),或者加上一些文字以作区别。
'zh-utf-8' => array('zh|chinese simplified', 'chinese_simplified-utf-8', 'zh', '中文UTF8'),光这样还不行,因为如果选择了以上的中文后,会出现以下错误:
错误感觉有些奇怪,难不成是 4.1 的 MySQL 里面不支持 gb2312 的 character?查了一下 MySQL ,果然没有 gb2312。SQL 查询: 编辑
SET NAMES gb2312;
MySQL 返回:文档
#1115 - Unknown character set: 'gb2312'

可能是编译时候没有加什么参数,不过这个问题暂时放着。
于是找到了设置这个 gb2312 的地方,按照以下方法强行将其改为 latin1(因为我们以前的数据是通过 latin1 的连接和存储安放在 MySQL 4.0 里面的)。
375行左右的 MySQL charsets map 中
这样 GB2312 的字符集就自动映射到 latin1 的 MySQL 字符集(MySQL charset)上去了。
'gb2312' => 'gb2312',
改为
'gb2312' => 'latin1',
结果就是以下的样子了。

这个时候似乎在 "MySQL 连接校对" 这里选择 latin1_swedish_ci 或者 utf8-unicode-ci 都可以正常显示了。还请大家多多指教!
参考文献: