« Mambo / Joomla CMS | 首 页 | eAccelerator 0.9.5 安装和性能测试 »

2007 年 05 月 30 日

phpMyAdmin中对GB2312和UTF8乱码的解决

| 分类: 服务器技术 Server Tech. |

本文只适合以下版本和数据库的组合
前提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
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 52 to server version: 4.1.14-log

Type '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 wrapper

Connection 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 sec

Threads: 1 Questions: 1207 Slow queries: 0 Opens: 34 Flush tables: 1 Open tables: 23 Queries per second avg: 0.962
--------------

前提3:数据库内容是从4.0导入的,并采用 latin1_swedish_ci 作为 数据库校对(collation)和连接校对(MySQL connection collation),其中的数据是通过 GB2312 的 html 进行来写入的。

乱码原因
我们通常会碰到以下情况:
在phpMyAdmin登陆时(Cookie),选用 "中文 - Chinese simplified (gb2312)"登陆(如下图)。

phpmyadmin_login

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

phpmyadmin_1

因此,我们曾经按 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', '中文'),
改为
'zh-gb2312-utf-8' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh', '中文'),
使其在 Language 菜单中显示 GB2312 的一项。
当然,如果你不需要中文的显示,可以 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'),
光这样还不行,因为如果选择了以上的中文后,会出现以下错误:
错误

SQL 查询: 编辑

SET NAMES gb2312;

MySQL 返回:文档
#1115 - Unknown character set: 'gb2312'

感觉有些奇怪,难不成是 4.1 的 MySQL  里面不支持 gb2312 的 character?查了一下 MySQL ,果然没有 gb2312。
MySQL_4.1.14_characters

可能是编译时候没有加什么参数,不过这个问题暂时放着。

于是找到了设置这个 gb2312 的地方,按照以下方法强行将其改为 latin1(因为我们以前的数据是通过 latin1 的连接和存储安放在 MySQL 4.0 里面的)。
375行左右的 MySQL charsets map 中


'gb2312' => 'gb2312',
改为
'gb2312' => 'latin1',
这样 GB2312 的字符集就自动映射到 latin1 的 MySQL 字符集(MySQL charset)上去了。
结果就是以下的样子了。

phpmyadmin_2

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


参考文献:

(END)

引用

引用本文的 URL:
http://weblog.kreny.com/cgi-bin/mt/mt-tb.cgi/250.

发表评论

(如果您还为在此成功留言,也许是因为需要管理员逐一审核留言内容后放可看到您的评论。请稍后并感谢您的耐心等待。)

阅览更多文章请访问 首页过去的存档