MySQL 4.1x 中文乱码问题
现在多数host装的还是MySQL 4.0x 版本以下,如果升级到了4.1x 或者移动到使用4.1x 的主机上,估计会遇到一些问题。我在powweb上遇到了两个问题。
一是数据导入。在phpMyAdmin内导入后,发现中文变成了乱码。搜索学习后,了解到需要设置数据库的collation (校勘),如果你的数据库是utf-8的,设置为utf8_general_ci就可以了。
二是,即使正确导入了,在phpMyAdmin里也能正确显示,但WordPress页面上显示的文章内容都是“???”,而模板里面的汉字都能正常显示。这让我头疼了很久。搜索到Windix’s Weblog上有对此的说明:
从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章”Character Set Support“后终于找到了解决方法并测试通过。
MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES ‘utf8′;
但是我依旧不知道,如何,在何处让WordPress运行这个SQL语句。后来在阿修的部落格上查到办法:
為著解決這個問題必須去修改wp-includes/wp-db.php內的資料連線設定。詳細的修改方式是這樣的:
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query("SET NAMES 'utf8'");
这样子终于能正常显示中文的WordPress了。虽然后来还是没用Powweb,但是觉得这个经验会对别人有用。记得有人用email和我讨论过这样子的中文显示问题,但是我那时哪里知道问题出在MySQL 4.1x上。
还有,4.1x的数据库不向下兼容,所以升级的时候要三思啊。

January 21st, 2007 at 1:46 pm
幸好你提出了在 wp-db.php 加入
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query(”SET NAMES ‘utf8′”);
否則我怎樣想也想不到竟是 wordpress 的問題! 謝謝你!
January 23rd, 2007 at 2:32 pm
最好還是在 my.cnf 入手, 不用逐個php程式改code。在 my.cnf 中的 [client] 和 [mysqld] 章節中都加上一行 default-character-set=utf8
就可以了:
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
January 27th, 2007 at 3:11 pm
[...] MySQL 4.1x 中文乱码问题 [...]
March 4th, 2007 at 11:57 am
百优科技
国际域名45/年.国内域名37/年.1G空间350/年.
http://www.100u.net
March 21st, 2007 at 6:01 am
[...] Corr @ 15:35 in Wordpress 上次有篇日志trackback到了桑葚兄那边,可是他那边出来的页面,除了标题,其他都是乱码。不知道他在后台看到的会不会也是乱码一片。今天在他那边看到这一篇文章《MySQL 4.1x 中文乱码问题》。我试着按照里面的办法改了一下wp-db.php文件,可是,好象不起作用,而且后台管理页面也出错的情况。没办法,再“骚扰”一次桑葚兄吧,不知道这次正常没有,但愿显示正确! [...]
March 23rd, 2007 at 4:45 pm
[...] MySQL 4.1x 中文乱码问题 [...]
March 29th, 2007 at 2:28 pm
b?茐瀂谡纥= A嫁鱷=遺|H.W.NL遫蠜蝧wy玩鹓垮7滮歼刍鹹砍鼷浳ow捷骥g竭L灈靟e??s? 藗馏 海Pa峳d ?帕韮??咚鯗空鑷y?J廈???y?R•咱>鎏€{?4 ?炙遪¬x % c姤€/塹k?5?^
软抃?巺 睙H:燆 忖E淐G 鉻鼿炶F?悵 0扱^駧諴瞣能獀?¬F|\o?
April 3rd, 2007 at 3:56 am
[...] SMF的那一篇文章 google找到的資料 主機商的回信 It appears that your mysql backup file is in UTF-8 encoding, it is likely that [...]
May 15th, 2007 at 11:53 am
[...] 所有数据库操作完成, 登陆网站查看,一下子傻了,除了我在侧边栏里写的自我简介那几个字是正常汉字,其它全以”?”显示。难道字符设置不对?不可能啊数据库是原来的,当然字符设置也是原来的”utf-8″。上网找答案,原来以前MySQL版本为4.0的转到4.1或者更高版本时,会出现乱码。上服务器的说明中查看,原来老的服务器MySQL版本为4.0,而新的服务器版本为5.0,晕哦,可真先进。继续google,在”桑林志“的”MySQL 4.1x 中文乱码问题“中找到了解决方案。 [...]
May 15th, 2007 at 3:38 pm
[...] 恢复过程通过HostMonster控制台自带的phpMyAdmin进行。为避免出现乱码,操作过程,参考了时光漫步,桑林志,夜工厂的文档,其中,推荐“时光漫步”的文档,图文并茂,简单易懂。 [...]
May 18th, 2007 at 3:18 pm
[...] 由于编码不同,备份好的数据重新导入后,乱码是必不可少的。参考了若干的文章,如桑志林等等,依旧不成功。最后的事实证明,教程都没有问题。不过其中有一个很重要的环节需要注意: [...]
June 6th, 2007 at 8:06 am
[...] 所有数据库操作完成, 登陆网站查看,一下子傻了,除了我在侧边栏里写的自我简介那几个字是正常汉字,其它全以”?”显示。难道字符设置不对?不可能啊数据库是原来的,当然字符设置也是原来的”utf-8″。上网找答案,原来以前MySQL版本为4.0的转到4.1或者更高版本时,会出现乱码。上服务器的说明中查看,原来老的服务器MySQL版本为4.0,而新的服务器版本为5.0,晕哦,可真先进。继续google,在”桑林志“的”MySQL 4.1x 中文乱码问题“中找到了解决方案。 [...]
June 8th, 2007 at 4:20 am
请问:不是这个版本的数据库可以用这样的方法解决吗?
June 8th, 2007 at 4:20 am
请问:不是这个版本的数据库可以用这样的方法解决吗?
July 6th, 2007 at 10:30 pm
Hi,
很高兴看到你的blog
我在备份的时候遇到同样问题,用您建议的方法试了很多次也没有成功
后来看系统的字符集和排序方式的设定,发现
| collation_server | latin1_swedish_ci |
| character_set_server | latin1 |
是不是这两个值不改成utf8的,字体就没法显示正确?我无法更改web hosting server的这两个值,请问有什么解决方案嘛?
多谢
July 18th, 2007 at 3:00 am
好有个问题就是从网页中提交中文到mysql数据库中
在页面可以正常显示中文,可是数据库中是乱码,如何解决?
August 14th, 2007 at 4:06 am
[...] 在此,要特别感谢桑林志的《MySQL 4.1x 中文乱码问题》,让我彻底走出了乱码阴影 [...]
August 17th, 2007 at 11:10 pm
这个帖子真热。
今天我也用 SET NAMES ‘utf8′ 解决了问题。
嘿嘿。
August 28th, 2007 at 3:47 am
你好,我的乱码问题更严重.想请你分析下看怎么解决.我用phpmyadmin管理mysql数据库时,将一个字段的整理属性由原来的latin1_swedish_ci改成gb2312导致该字段乱码,然后改回原来的latin1_swedish_ci也不管用了,全变成?了.而且改回来后还是乱码.能解决的话,麻烦联系下我.
qq:30104993
August 30th, 2007 at 2:29 am
感謝哦,原來是這樣。
December 2nd, 2007 at 9:13 am
非常感谢
December 30th, 2007 at 9:48 am
[...] MySQL 4.1x 中文乱码问题 [...]
January 14th, 2008 at 7:39 am
[...] 站点的界面暂时稍稍做了一点小修改,不过配色还大概需要再改善(没办法,我不是专业的designer,所以配色都是trial and error的)。Blog也顺便直接跳过Wordpress 2.3.1直接upgrade到2.3.2。至于之前无聊人遇到的问题这里倒是没有出现,我想我需要简单的解释一下。据我所知,自从MySQL更新到大概4.x的时候,它就加强了对Unicode的支援(包括可以为内容排序),但是之前对unicode的支援不是很完善,所以MySQL更新到4.x的时候会出现encoding上的混淆。为此当时候我花了好一阵子的时间把这个blog的所有data全部转去正确的unicode再重新导进database内。可是当时Wordpress和MySQL的沟通不太好(因为不是每个MySQL Server都会by default output in unicode的),每次upgrade wordpress的时候我都要修改一点点wordpress的coding。后来跳到2.3.0我总算不需要每次更新就去修改那个file,所以这次upgrade我的中文字还是很完美的出现在大家面前。 [...]