WP和MT的MySQL乱码问题解决方法

发表于 2006-02-06 23:00 | 分类: 菠萝菠萝蜜 | tags: , , | 发表评论

WordPress和MovableType是主流的Blog系统,而他们都用的是MySQL数据库,那么在MySQL4.1下,中文的WP和MT就会产生种种的乱码问题。

如前MySQL4.1乱码问题分析的,一个程序( PHP,CGI 等)与MySQL建立连接后,这个程序发送给MySQL的数据采用的是什么字符集,MySQL 是无从得知的。所以解决乱码问题的根本就是我们在程序中告诉MySQL采用的编码是什么,简单的就是在程序中加入这样的一个语句:

SET NAMES ‘utf8′

这个语句的效果等同于同时设定了

SET character_set_client=’utf8′
SET character_set_connection=’utf8′
SET character_set_results=’utf8′

为什么这么做?

我们安装MySQL4.1时按照默认配置,那么default-character-set= utf8。在MySQL Command Line Client下查看到的查看系统的字符集和排序方式的设定为:

mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name            |            Value           |
+————————–+—————————-+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| 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   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
+———————-+——————-+
3 rows in set (0.00 sec)

按照MySQL的存储机制,数据在传输的过程中就会在latin1和utf8两种编码之间互相转换,这样就很容易的变成了乱码。我们在程序中设置了SET NAMES ‘UTF8′,就等同于把所有的编码都设置为utf8,这样数据就没有了编码转换问题,也就没有了乱码问题了。

在WP和MT中的设置方法

那么具体在WordPress和MovableType中,怎么设定SET NAMES ‘UTF8′呢?

对于PHP的MySQL系统来说,这样的修改很简单:

找到wp-includes/wp-db.php

$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);

//加上下面这行

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

对于用Perl的MT系统来说,同样的修改方法是:

在 MT 目录下找到lib/MT/ObjectDriver/DBI/mysql.pm
加上以下粗体显示的那行

   sub init {
    my $driver = shift;
    $driver->SUPER::init(@_);
    my $cfg = $driver->cfg;
    my $dsn = ‘dbi:mysql:database=’ . $cfg->Database;
    $dsn .= ‘;hostname=’ . $cfg->DBHost if $cfg->DBHost;
    $dsn .= ‘;mysql_socket=’ . $cfg->DBSocket if $cfg->DBSocket;
    $dsn .= ‘;port=’ . $cfg->DBPort if $cfg->DBPort;
    $driver->{dbh} = DBI->connect($dsn, $cfg->DBUser, $cfg->DBPassword,
        { RaiseError => 0, PrintError => 0 })
        or return $driver->error(MT->translate(”Connection error: [_1]”,
             $DBI::errstr));
    $driver->{dbh}->do(”SET NAMES ‘utf8′”);     //加上这行
    $driver;

这样的Blog系统,数据在传输和存储的过程中,都不会出现乱码了。

ps:MT系统的修改方法感谢Pedro MeloZack 和 e-luck 的指点。也感谢xdanger最终在邮件中的帮助。

Trackback this post

No comments yet. Be the first.

Leave a reply

(必需)

(必需,但不会被泄露)