MySQL 4.1x 中文乱码问题
by Yan
现在多数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的数据库不向下兼容,所以升级的时候要三思啊。
幸好你提出了在 wp-db.php 加入
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query(“SET NAMES ‘utf8′”);
否則我怎樣想也想不到竟是 wordpress 的問題! 謝謝你!
最好還是在 my.cnf 入手, 不用逐個php程式改code。在 my.cnf 中的 [client] 和 [mysqld] 章節中都加上一行 default-character-set=utf8
就可以了:
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
[…] MySQL 4.1x 中文乱码问题 […]
百优科技
国际域名45/年.国内域名37/年.1G空间350/年.
http://www.100u.net
[…] Corr @ 15:35 in WordPress 上次有篇日志trackback到了桑葚兄那边,可是他那边出来的页面,除了标题,其他都是乱码。不知道他在后台看到的会不会也是乱码一片。今天在他那边看到这一篇文章《MySQL 4.1x 中文乱码问题》。我试着按照里面的办法改了一下wp-db.php文件,可是,好象不起作用,而且后台管理页面也出错的情况。没办法,再“骚扰”一次桑葚兄吧,不知道这次正常没有,但愿显示正确! […]
[…] MySQL 4.1x 中文乱码问题 […]
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?
[…] SMF的那一篇文章 google找到的資料 主機商的回信 It appears that your mysql backup file is in UTF-8 encoding, it is likely that […]
[…] 所有数据库操作完成, 登陆网站查看,一下子傻了,除了我在侧边栏里写的自我简介那几个字是正常汉字,其它全以”?”显示。难道字符设置不对?不可能啊数据库是原来的,当然字符设置也是原来的”utf-8″。上网找答案,原来以前MySQL版本为4.0的转到4.1或者更高版本时,会出现乱码。上服务器的说明中查看,原来老的服务器MySQL版本为4.0,而新的服务器版本为5.0,晕哦,可真先进。继续google,在”桑林志“的”MySQL 4.1x 中文乱码问题“中找到了解决方案。 […]
[…] 恢复过程通过HostMonster控制台自带的phpMyAdmin进行。为避免出现乱码,操作过程,参考了时光漫步,桑林志,夜工厂的文档,其中,推荐“时光漫步”的文档,图文并茂,简单易懂。 […]
[…] 由于编码不同,备份好的数据重新导入后,乱码是必不可少的。参考了若干的文章,如桑志林等等,依旧不成功。最后的事实证明,教程都没有问题。不过其中有一个很重要的环节需要注意: […]
[…] 所有数据库操作完成, 登陆网站查看,一下子傻了,除了我在侧边栏里写的自我简介那几个字是正常汉字,其它全以”?”显示。难道字符设置不对?不可能啊数据库是原来的,当然字符设置也是原来的”utf-8″。上网找答案,原来以前MySQL版本为4.0的转到4.1或者更高版本时,会出现乱码。上服务器的说明中查看,原来老的服务器MySQL版本为4.0,而新的服务器版本为5.0,晕哦,可真先进。继续google,在”桑林志“的”MySQL 4.1x 中文乱码问题“中找到了解决方案。 […]
请问:不是这个版本的数据库可以用这样的方法解决吗?
请问:不是这个版本的数据库可以用这样的方法解决吗?
Hi,
很高兴看到你的blog
我在备份的时候遇到同样问题,用您建议的方法试了很多次也没有成功
后来看系统的字符集和排序方式的设定,发现
| collation_server | latin1_swedish_ci |
| character_set_server | latin1 |
是不是这两个值不改成utf8的,字体就没法显示正确?我无法更改web hosting server的这两个值,请问有什么解决方案嘛?
多谢
好有个问题就是从网页中提交中文到mysql数据库中
在页面可以正常显示中文,可是数据库中是乱码,如何解决?
[…] 在此,要特别感谢桑林志的《MySQL 4.1x 中文乱码问题》,让我彻底走出了乱码阴影 […]
这个帖子真热。
今天我也用 SET NAMES ‘utf8’ 解决了问题。
嘿嘿。
你好,我的乱码问题更严重.想请你分析下看怎么解决.我用phpmyadmin管理mysql数据库时,将一个字段的整理属性由原来的latin1_swedish_ci改成gb2312导致该字段乱码,然后改回原来的latin1_swedish_ci也不管用了,全变成?了.而且改回来后还是乱码.能解决的话,麻烦联系下我.
qq:30104993
感謝哦,原來是這樣。
非常感谢
[…] MySQL 4.1x 中文乱码问题 […]
[…] 站点的界面暂时稍稍做了一点小修改,不过配色还大概需要再改善(没办法,我不是专业的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我的中文字还是很完美的出现在大家面前。 […]
Assuming either the Left Wing or the Right Wing gained control of the country, it would probably fly around in circles.
Listen. Do not have an opinion while you listen because frankly, your opinion doesn?t hold much water outside of Your Universe. Just listen. Listen until their brain has been twisted like a dripping towel and what they have to say is all over the floor.
[…] 上面的方法Discuz!论坛上那位网友自己也说是个笨办法。其实这个方法与 桑林志的解决方法 […]
我是用手動建立database的方式解決的, 但要確定Database預設為unicode
我有把方法寫下來大家有空參考下給個意見吧