wordpress升级、数据备份导致中文乱码的问题


wordpress的强大功能使我最终对国产Blog说GOODBYE。但是与其它PHP+MYSQL的程式一样,在数据库转移的过程中存在着无法导入、乱码的问题。
总的来说,数据库转移时,最后不要跨MYSQL的版本,不要在MySQL 4.0、MySQL 4.1、MySQL 5.0这些不同的版本中转换数据,如果必须转换,最好也是从低版本到高版本的转换。
对于乱码的问题,我参考了很多的资料,总结如下:
1、我目前使用的方法:
[coolcode]
修改用WP-DB Backup导出的文件,
把全部替换为
DEFAULT CHARSET=utf8,
重新导入,一切OK
Collation也为utf8_general_ci.
修改wp-includes/wp-db.php
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
//加入以下一行
$this->query(“SET NAMES ‘utf8′”);
OK,收工.
注:
SET NAMES ‘utf8′;

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8
相关语句:
SET CHARACTER SET utf8;
SET COLLATION_CONNECTION=’utf8_general_ci’;
查看数据库当前语系,一般默认为latin-1:
show variables like ‘%character%’;

[/coolcode]

一般在用phpMyAdmin创建数据库时,可指定整理为utf8_general_ci (ci 代表 case insensitve 不区分大小写),如果是自己的主机,可以直接在my.ini 中设定:
[mysqld]
default-character-set=utf8
告訴mysql server启动时要用 utf-8即可。
如果你已经创建好了数据库,可以通过如下SQL语句修改:
ALTER DATABASE `blog` CHARACTER SET utf8;
ALTER TABLE `blog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
2、一些说明
从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)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:

mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
7 rows in set (0.00 sec)mysql> SHOW VARIABLES LIKE ‘collation_%’;
+———————-+——————-+
| Variable_name | Value |
+———————-+——————-+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+———————-+——————-+
3 rows in set (0.00 sec)

上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)…当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法同上。
[CONTACT-FORM]

3 条评论

  1. Hi,
    很高兴看到你的blog
    我在备份的时候遇到同样问题,用您建议的方法试了很多次也没有成功
    后来看系统的字符集和排序方式的设定,发现
    | collation_server | latin1_swedish_ci |
    | character_set_server | latin1 |
    是不是这两个值不改成utf8的,字体就没法显示正确?我无法更改web hosting server的这两个值,请问有什么解决方案嘛?
    多谢

  2. 谢谢,我是在同一个版本下操作的
    备份之后打算恢复看看成功与否,结果都是乱码。
    CSR说不应该需要修改server的设置
    可是我用其他方法总是不成功

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据