WP和MT的MySQL乱码问题解决方法
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 Melo,Zack 和 e-luck 的指点。也感谢xdanger最终在邮件中的帮助。