Tao道-博客黑洞

February 22nd, 2006

WordPress数据库恢复编码转换[解决乱码问题]

Posted by kunstao in wordpress教程

为了今后wordpress数据库备份方便,把数据库默认的latin 1 转换成了utf8

大致过程如下:

1.备份 http://www.sh18.org/blog/ 数据库

2.用 EditPlus 打开 http://www.sh18.org/blog/备份的数据库 文件,查找“DEFAULT CHARSET=latin1” 用“DEFAULT CHARSET=utf8”替换.

3.创建一个新的数据库,用phpadmin进入界面后,

(1).点击左边你的数据库名后,右上方会有“Operations/操作”按钮,进入后最下面有“Collation:/整理:  ”选项,选择 相应的utf8后按“go/执行”确认【这个步骤是把数据库默认编码设置成utf8】

(2).点击“Home  /主目录”按钮 ,返回主界面 更改“MySQL connection collation: /collation (校勘)字符集”为utf8_general_ci 【这个步骤有什么用不知道,反正做了没坏处】

参考文档

http://yanfeng.org/blog/585/

http://voivo.de/blog/374.html

http://www.zuola.com/weblog/?p=355

然后导入前面备份的数据库(修改过的,注意导入的时候选utf8)

4.更改WordPress程序中wp-includes/wp-db.php的文件:选择在56行处添加

$this->query(”SET NAMES ‘utf8′ “);

复制语句时小心字体哦,我复制的代码加入后报错,原来那些>”‘什么的都不正确。

更改后的情况是:
}
$this->query(”SET NAMES ‘utf8′ “);
$this->select($dbname);
}

5.更改 wp安装目录下的wp-config.php 文件,把里面数据库相应的参数修改为 新的数据库名字。

6.然后 登陆 www.sh18.org/blog 基本正常,发现文章的中文分类名出现“??”字符,进入后台,重新更改分类后一切正常.

7.发新贴看是否一切正常。。。。。

8.待测试。。。。

因为流量关系,为网站做了个镜像站点,等待流量快超标的时候做个域名转向来缓解压力。在新的服务器上安装 了Wordpress后,开始进行数据库操作:

1. 备份原来网站的数据库:操作很简单,进入PhpMyAdmin后选择导出,在表单选择框里选择全部。选择”另存为文件”中的”

2. 恢复备份数据库到新的服务器中:进入新服务
器的PhpMyAdmin,(因为已经在这里建立了Wordpress,所以已经存在一个新的数据库了),在”结构”中选择所有表单,然后在”选中项”中
选择”删除”,原有的数据库清空。然后在”SQL”中点击”浏览”选择刚才备份的数据库文件,点击”执行”即可。

可在这个时候出现了问题:总是说什么超出了Memory,或者说超过了30秒的限制,无法正常导入。导入数据库文件大小限制一般为2M,我的备份文件不过才800多KB,为什么不行呢?后来明白,可能是新的服务器连接速度有些慢,所以在进行导入时,总是超过了时间限制。

解决办法:备份数据库时,分几次备份不同的表单,而不是一次重复全部,就这样重复1,2两个步骤三次,总算把数据库正常导入了。

3. 站内链接调整:因为数据库相同,当然网站里所有站内链接也会和原来的相同,全部指向的还是原来的服务器地址。在PhpMyAdmin里选择数据库中的”wp_options“表单,点击”浏览”然后按”option_name”排列主键顺序,找到”option_name”键值为”siteurl”一项,点击”编辑”按钮,把里面的原来网站链接地址改为新的。然后找到”home”一项,同样编辑把链接改成新的网址。

所有数据库操作完成,
登陆网站查看,一下子傻了,除了我在侧边栏里写的自我简介那几个字是正常汉字,其它全以”?”显示。难道字符设置不对?不可能啊数据库是原来的,当然字符
设置也是原来的”utf-8″。上网找答案,原来以前MySQL版本为4.0的转到4.1或者更高版本时,会出现乱码。上服务器的说明中查看,原来老的服
务器MySQL版本为4.0,而新的服务器版本为5.0,晕哦,可真先进。继续google,在”桑林志“的”MySQL 4.1x 中文乱码问题“中找到了解决方案。

1. 设置数据库的”collation”为”utf8_general_ci”:因为在新的服务器中建立数据库时,没有指定其为utf-8,更没设定collation,所以需要先设定数据库的字符集。

执行命令:
alter database myblog
character set utf8;

然后再在”操作”或者数据库PhpMyAdmin的登陆页面中设定collation为”utf8_general_ci”。

2. 更改WordPress程序中wp-includes/wp-db.php的文件:我是选择了在56行处,而不是44行处(桑林志的做法)加入了如下语句:

$this->query(”SET NAMES ‘utf8′”);

复制语句时小心字体哦,我复制的代码加入后报错,原来那些>”‘什么的都不正确。

再次登陆网站查看,终于一切正常!!!整个操作时间耗费了大概6个小时,主要是网上查找解答太费时间,而且在设定collation时麻烦不小,因为我原来的服务器竟然关闭了调整Collation的命令。显示为:”使用链接表的额外特性尚未激活。要查出原因,请单击此处。”,还好它默认为字符集为”UTF-8″不然估计我的数据库是无论如何都不能恢复到更高版本的MySQL里了。

随机文章推荐:

22 Responses to ' WordPress数据库恢复编码转换[解决乱码问题] '

Subscribe to comments with RSS or TrackBack to ' WordPress数据库恢复编码转换[解决乱码问题] '.

  1. Blogging Pro China » Blog Archive » WordPress数据库恢复编码转换[解决乱码问题] said:

    [...]   WordPress数据库恢复编码转换[解决乱码问题],为了今后wordpress数据库备份方便,把数据库默认的latin 1 转换成了utf8。 database mysql utf8 [...]

    February 22nd, 2006 at 9:55 am

  2. TechPush said:

    [...] 由于Dreamhost默认的数据库字符编码为Latin1而不是utf8,这样当你撰写中文文章时,尽管PHP的解析没问题,站点上可以看到正常显示中文,但如果你进入PHPMyAdmin,就会发现那些中文都变成了乱码,这样会导致数据库备份无法显示中文,也就失去了意义(当你导入以前站点备份的数据(通常编码为Utf8)时,也会出现同样的问题),解决办法可以参考这篇文章:WordPress数据库恢复编码转换[解决乱码问题]。里面已经说得很详细了,对于像我这样刚刚使用Dreamhost服务的人来说很有用,这里我认为有两步最为关键: [...]

    March 27th, 2006 at 2:34 pm

  3. c-str said:

    Mysql自4.1以后,增加了对字符集的支持。笔者之前对Mysql比较了解,刚接触4.1时,感觉Mysql有点多此一举,但后来细想发现,对字符集的支持,虽然对开发者来说,会麻烦一些,但不可否认,是一种进步。对字符集的支持,不仅更加支持多语言,而且,也方便移植。
    刚开始使用Mysql4.1,你可能感觉有点不适,下面,简单阐述一下笔者对Mysql4.1字符集的理解,再讲述如何PHP如何适应Mysql的这种变化,希望大家看过这文章后,能够有所收获。
    如果你对计算机基础知识不了解,请直接阅读“结论篇”
    一.原理篇
    Mysql的字符集里有两个概念,一个是“Character set(字符集)”,另一个是“Collations”。
    1. Collations
    Collations翻成中文是“校验”,在网页开发的过程中,这个词汇,只在Mysql里使用,主要作用是指导Mysql对字符的比较,比如, ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A之类的。通常,大家基本可以忽略Collations的存在,因为每个字符集都有一个默认的Collations,通常,使用默认的Collations就可以了。
    2.字符集
    与这对比的是,字符集是个更广的概念,即使是Windows下普通的文本文件,也渗及到字符集的问题。不同的字符集,规定了不同的字符的编码方式。一个 character set (字符集)是一组符号和编码,比如,ASCII字符集,包括的字符有:数字,大小写字母,分号、换行之类的符号,编码方式是用一个7bit表示一个字符(A的编码是65,b的编码是98)。ASCII只规定了英文字母的编码,非英文语言不能用ASCII编码表示,为此,不同的国家,都为自己的语言做了编码,比如,我们国家,就有GB2312编码。但每个国家之间的编码不同,也存在着一些跨平台的问题,为此,一些国际化标准组织,就制定了一些国际通用的编码,最常用的就是UTF8了。ASCII只对英文符号和英文字母做了编码,GB2312对英文符号,英文字母,汉字做了编码,UTF8对世界上所有的语言文字做了编码,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可见,UTF8是所含最广字符的字符集,所以,在一些多语言的WEB系统中,一般用UTF8字符集(PHPMyAdmin使用UTF8编码)。
    任何文本的存储,都渗及到字符集的概念。包括数据库,也包括普通的文本文件。
    主要术语:
    字符:汉字,英文字母,标点符号,拉丁文等等。
    编码:将字符转换成计算机存储的格式,比如,A用65表示。
    字符集:一组字符以及对应的编码方式。
    a. Mysql的字符集
    Mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。
    Mysql可以设置服务器级字符集、数据库级字符集、数据表级字符集、表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置 table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。
    服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。
    Mysql一定有一个字符集,可以通过启动时加参数指定,也可以编译时指定,也可以在配置文件里指定。Mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。
    通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。
    由于UTF8是最广的字符集,所以,一般情况下,我们设置Mysql服务器级的字符集为UTF8!
    b. 普通文本的字符集问题
    任何文本的存储,都存在着字符集的问题,普通文本文件也不例外。
    Windows2000+的系统中,打开记事本,“保存为…”对话框,就有一个选项,可以让你选择存储文本的编码方式。
    通常情况下,大家都使用Windows2000+的系统,都使用默认的编码,所以,不会碰到字符集的问题。
    Windows下,保存文本文件时,可以选择编码方式,但打开文本文件时,都是自动判断编码方式的。网上有一个用Windows2000+的记事本玩移动,联通的笑话,大家可以搜搜,就是因为Windows在打开文本文件时,编码判断错误引起的问题。
    因为自动判断编码有时会错误,所以,有的文本文件,规定了如何识别自身所使用的编码。HTML文件就是一个这样的例子。
    HTML是文本文件。存储HTML文件的时候,需要使用一个编码,并且,在HTML文件里,也使用HTML语法,指定了该文件所使用的编码(比如)。如果HTML文件没有指定编码,则浏览器自动识别文件的编码。如果HTML指定了编码,则浏览器使用HTML指定的编码。
    通常情况下,HTML文件指定的charset和HTML文件自身的编码是一致的,但也有不一致的情况,如果不一致,就会导致网页乱码(此处乱码,只和文本文件有关,和数据库无关。)使用专门的网页编辑工具(比如Dreamwave),会自动根据网页中的charset值来编码文件。
    c. php+mysql的字符集问题
    PHP最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。
    由于Mysql支持多字符集,默认情况下,Mysql不知道PHP发给他的是什么编码的字符,所以,Mysql要求客户端(PHP)告诉他存取的字符集是什么。
    PHP通过设置character_set_client,告诉Mysql,PHP存进数据库的是什么编码方式。
    PHP通过设置character_set_results,告诉Mysql,PHP需要取什么样编码的数据。
    PHP通过设置character_set_connection,告诉Mysql,PHP查询中的文本,使用什么编码。
    MYSQL使用设置的编码方式存储文本。
    假设Mysql使用setserver来存储文本,PHP的character_set_client是setclient,PHP的 character_set_results是setresult。那么,Mysql将PHP发来的文本,从setclient编码方式,转换成 setserver编码方式,再存入数据库,如果PHP取文本,Mysql将文本从setserver转换成setresult,再发送给PHP。
    PHP文件(最终生成的HTML文件)本身有个编码,如果Mysql传过来的编码,与PHP文件自身的编码不同,那么,整个网页,必然乱码。所以,PHP一般将自己的编码方式,告诉Mysql。
    要保证不乱码,就必须将三个编码统一:一是网页自身的编码,二是HTML里指定的编码,三是PHP告诉Mysql的编码(包括character_set_client和character_set_results)。
    第一和第二个编码,如果使用DW之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。
    第三个编码,需要手工通知Mysql。这步可以通过在PHP里使用mysql_query(“set names characterX”)来实现。
    d.字符集的转换问题
    如果小字集转换成大字符集,不会丢失数据,但大字集,转换成小字集,可能会丢失数据。
    比如,UTF8里有的字符,GB2312不一定有,所以,从UTF8转换到GB2312可能会丢失一些字符。
    但有种情况例外,先从GB2312转成UTF8,再从UTF8转成GB2312,这种情况是不会丢数据的,因为,刚开始转换的文本,都是GB2312里的字符,所以,整个过程都是GB2312的字符在转换,不会丢失。
    正因为UTF8能容纳世界上的所有字符,所以,数据库一般使用UTF8编码。这使得,任何字符都可以存进UTF8编码的数据库。
    e. PHPMyAdmin乱码的问题
    PHPMyAdmin支持多国语言,这就必定要求HTML页面使用UTF8编码。
    HTML页面使用UTF8编码,这就必定要求PHPMyAdmin连接Mysql时,character_set_client和character_set_results使用UTF8编码。
    当前情况下,PHP连接Mysql只能是使用set names(或其它几个语句)来通知Mysql的编码方式,如果没有显式的声明编码方式,都将使用latin1编码。一般的程序,都没有显式声明 character_set_client变量,所以,都是将gb2312文本,按latin1编码方式存在数据库,PHPMyAdmin再用utf8格式读取,肯定是乱码的。
    如果PHP程序按正确的编码存入数据库,肯定是没有问题的。所以,需要修改的不是PHPMyAdmin.(虽然有时修改PHPMyAdmin可以解决乱码问题,但这不是问题的根本)
    二.总结篇
    上面的讲得有点乱,总结一下:
    1.数据库尽量使用utf8存储(修改/etc/my.cnf,在[mysqld]段加上default-character-set=utf8)
    (已有的数据库,先转成UTF8格式)
    2.PHP程序在查询数据库之前,执行mysql_query(“set names xxxx”);其中xxxx是你网页的编码(charset=xxxx),如果网页中charset=utf8,则xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,如果网页中的charset=ipaddr,则xxxx=ipaddr (开个玩笑,没这编码)
    几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入mysql_query(“set names”)就可以了。
    3.PHPMyAdmin不需要做改动。
    4.需要注意的是,为保证网页实际编码(Windows保存对话框里的编码)和他声明的编码(charset=?)是一致的,请用DW之类的工具做网页。
    写得有点仓促,希望大家指正和补充。

    March 30th, 2006 at 10:03 am

  4. iis中PHP/mysql/zend/phpmyadmin等基础环境实际运用总结 said:

    一.先说一下PHP环境中2个最重要的搭配,PHP和MYSQL最佳版本的搭配,这个在网上很少说到,但我在这次升级中分别进行了3个版本的搭配,有点心得,和大家分享.

    1.php4.4.X + mysql4.0.X,这个搭配是在PHP4的比较理想的环境 ,PHP4对MYSQL的接口很匹配,所存在的问题是,MYSQL4.0.X不支持多语言字符,所以以后在转服务器中需要升级数据库会出现乱玛,会遇到很多麻烦.

    2.PHP4.4.X + mysql4.1.X,这个搭配也是PHP4的理想环境,mysql4.1.X支持多语言字符,以后升级会比较容易,但是PHP4.4.X对于MYSQL4.1.X的接口程序比较老,导致PHPMYADMIN和PHP程序存在无法连接数据库的情况.不过好在已经有解决的办法:

    April 11th, 2006 at 11:13 am

  5. Sumnny said:

    [...] 更新:WordPress数据库恢复编码转换[解决乱码问题] [...]

    May 10th, 2006 at 5:08 pm

  6. xLight的蓝闪小窝 » links for 2006-05-12 said:

    [...] Tao道-博客黑洞 » WordPress数据库恢复编码转换[解决乱码问题] (tags: MYSQL Charset) [...]

    May 12th, 2006 at 2:59 pm

  7. 暖鱼晃荡志 » Blog Archive » 编码备份测试 said:

    [...] Tao道-博客黑洞 WordPress数据库恢复编码转换[解决.. WordPress数据库恢复编码转换[解决乱码问题],为了今后wordpress数据库备份方便,把数据库默认的latin…意义(当你…解决办法可以参考这篇文章:WordPress数据库恢复编码转换[解决乱码问题]。里面已经说得很详细了,对于像我这样刚刚… [...]

    June 5th, 2006 at 7:41 pm

  8. 时光漫步 » links for 2006-07-23 said:

    [...] Tao道-博客黑洞 » WordPress数据库恢复编码转换[解决乱码问题] (tags: wordpress 乱码 数据库) [...]

    July 23rd, 2006 at 8:47 pm

  9. 时光漫步 » Blog Archive » 关于数据库导入乱码的问题 said:

    [...] 参考2:http://tao.kaoart.info/cms-software-doc/wordpress-about/kunstao/2006/554/ [...]

    July 28th, 2006 at 12:10 pm

  10. 雙葉 » 我又回来了 said:

    [...] 同时也对zola不厌其烦解决我的提问表示感谢,同时对http://tao.kaoart.info/cms-software-doc/wordpress-about/kunstao/2006/554/, http://blog.manboo.info/224.htm表示感谢,感谢上述两位解决了我数据转入乱码的问题,虽然我没有当面请教只是通过他们的blog看到相关信息。要感谢的还有我的父母以及姐姐,当然还有CCTV/MTV…… [...]

    July 30th, 2006 at 11:59 pm

  11. 开发者社区 said:

    @mysql_query(”SET NAMES ‘utf8′”);
    不错,这句简直就是万能语句,只要保证页面用u8,数据库u8,很多问题都能解决,zen-cart,joomla都很好用,呵呵

    July 31st, 2006 at 10:14 am

  12. 双叶@Donews » links for 2006-07-31 said:

    [...] Tao道-博客黑洞 » WordPress数据库恢复编码转换[解决乱码问题] (tags: wordpress) [...]

    July 31st, 2006 at 8:48 pm

  13. y0ungs said:

    我想问一下。我把我的英文模板的一些php文件换成了UTF8的编码 是不是就依偎着所有的php文件都要换成这个编码呢?是不是还要在程序的某个地方设置一下整个blog的编码?
    我现在发现我的feed也有点问题,feedsky和feedburner已经很久没有抓取过我的feed了
    请给我邮件或者到我的blog留言好吗?我不一定能及时看到你的回复。谢谢

    August 8th, 2006 at 7:03 am

  14. Nickcheng.LOG » Blog Archive » 搬家基本完毕 said:

    [...] 和我猜测的一样, DB的搬移是比较费时的工作! 原来在edong的空间的mysql版本是3.2, 而bluehost新空间的版本是4.2的, 这版本的跨越可不是数字的变化这么简单! mysql在跨越4.1版本的时候增加了数据库的Collection属性. 通俗的说, 这个属性控制了数据库中字符的编码类型, 如果配置的不当, 就会出现汉字变成乱码的情形! 呵呵, 我有幸遇到了! 不过还好网民的力量是无穷的, 在Google了一圈以后, 我还是找到了解决方法! 看这篇文章 [...]

    September 22nd, 2006 at 12:38 pm

  15. Nickcheng.LOG » Blog Archive » Wordpress升级到2.0.5 said:

    [...] 参考之前自己参考过的那篇文章. [...]

    October 30th, 2006 at 11:42 am

  16. 嘿嘿 » 博客文章 » 乱码 said:

    [...] 由于Dreamhost默认的数据库字符编码为Latin1而不是utf8,这样当你撰写中文文章时,尽管PHP的解析没问题,站点上可以看到正常显示中文,但如果你进入PHPMyAdmin,就会发现那些中文都变成了乱码,这样会导致数据库备份无法显示中文,也就失去了意义(当你导入以前站点备份的数据(通常编码为Utf8)时,也会出现同样的问题),解决办法可以参考这篇文章:WordPress数据库恢复编码转换[解决乱码问题]。里面已经说得很详细了,对于像我这样刚刚使用Dreamhost服务的人来说很有用,这里我认为有两步最为关键: [...]

    November 2nd, 2006 at 2:27 pm

  17. 自然的簫聲 said:

    實戰:WordPress数据库恢复及解决乱码问题…

    前因:
    不明原因,昨天留言顯示區域出現問題,害我花了2個小時重新恢復;但是發現仍舊存在下面問題:
    相關截圖:

    似乎是垃圾留言引起的問題?
    0、我全新安裝后重新倒入備份數據,….

    November 29th, 2006 at 4:23 am

  18. 李杰的博客 | jaylee’s blog : 为Wordpress搭建一个镜像 said:

    [...] WordPress数据库恢复编码转换[解决乱码问题] [...]

    January 27th, 2007 at 7:36 pm

  19. 我的WP升级恢复手记 at Pinsen’s blog said:

    [...] 反正大概就是这么个事,想着挺烦心的,越说越不是那么回事,差不多就这样了。本也不想早上一起来就弄的,可总觉得摆在一边更不像回事,就再弄弄,忽然发现自己很笨为什么发要钉死在E-space的那篇博文上呢,看来前天晚上的确是弄糊涂了,就又去搜了搜数据库恢复的日志,果不其然Tao道那找到一篇相似的数据库恢复编码转换的文章,文后的那一段应该是借用了E-space的文章,重要的是文前面的那一段对我很有用。之后的过程就和他文中写的差不多了。操作流程就不罗嗦了,Tao道那篇文章里都有。对我来说最重要的就是下面这一步了。 [...]

    July 28th, 2007 at 10:28 pm

  20. 我的WP升級恢復手記 at Pinsen’s blog said:

    [...] 反正大概就是这么个事,想着挺烦心的,越说越不是那么回事,差不多就这样了。本也不想早上一起来就弄的,可总觉得摆在一边更不像回事,就再弄弄,忽然发现自己很笨为什么发要钉死在E-space的那篇博文上呢,看来前天晚上的确是弄糊涂了,就又去搜了搜数据库恢复的日志,果不其然Tao道那找到一篇相似的数据库恢复编码转换的文章,文后的那一段应该是借用了E-space的文章,重要的是文前面的那一段对我很有用。之后的过程就和他文中写的差不多了。操作流程就不罗嗦了,Tao道那篇文章里都有。对我来说最重要的就是下面这一步了。 [...]

    July 29th, 2007 at 7:25 pm

  21. 李杰的博客 jaylee’s blog : Blog Archive : Wordpress升级和数据库导入导出经验分享 said:

    [...] WordPress数据库恢复编码转换[解决乱码问题] [...]

    August 15th, 2007 at 10:50 am

  22. 启用新域名 - Lifelong Learning said:

    [...] 同时,我把空间也从Dreamhost迁回了国内的主机服务商梦游科技,现在看起来访问速度颇为理想。之前所用的wordpress为2.0版本,刚开始还担心在2.3.2版本恢复原来的数据会有问题。经过两小时的努力,发现情况还算良好。就是恢复过程稍微复杂一些,大致分成以下几步: 1. 在新空间安装wordpress 2.0版本 2. 通过phpMyadmin,导入原来wordpress的Mysql数据,导入过程中遇到的中文乱码问题,参考《WordPress数据库恢复编码转换[解决乱码问题]》后解决。 3. 升级wordpress 2.0 -> 2.3.2,具体过程可参考《WordPress 2.3.1 简体中文第一版发布!》。 4. 升级后发现内容页面又变成乱码,原来是wp-config.php没采用2.3.2版本的,重新上传后问题解决! [...]

    January 3rd, 2008 at 7:24 pm

Leave a reply

You must be logged in to post a comment.

本日推荐网站