有关mysql字符集和中文乱码问题

mysql4.1开始引入多语言支持,因此数据库移植或者从php存取数据,用phpmyadmin管理时都可能会出现中文乱码问题。要想解决问题,我们首先要弄明白mysql字符集的问题。

mysql4.1及其之后的版本,对字符集的支持分为四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection):

character_set_server:这是设置服务器使用的字符集

character_set_client :这是设置客户端发送查询使用的字符集

character_set_connection :这是设置服务器需要将收到的查询串转换成的字符集

character_set_results :这是设置服务器要将结果数据转换到的字符集,转换后才发送给客户端

整个过程:

- client(如php程序)发送一个查询;

- 服务器收到查询,将查询串从character_set_client 转换到character_set_connection,然后执行转换后的查询;

- 服务器将结果数据转换到character_set_results字符集后发送回客户端。

你可以用下边两条命令查看一下系统的字符集和排序方式设定:

mysql> SHOW VARIABLES LIKE ‘character_set_%’;

mysql> SHOW VARIABLES LIKE ‘collation_%’;

mysql 默认用的字符集是latin1,连接校对用的latin1-_swedish_ci。看到这儿你应试有点明白了,我们通过php发送的查询一般是utf8或者GBK,GB2312,而它默认的是latin1,所以用phpmyadmin查看或者直接进数据库里查看数据,都是一些乱码。(存取出来放在网页上大多是正常的。)phpmyadmin在对mysql4.0以下会使用内置的库来实现字符集的转换,从而支持多语言版本,而对于4.1以上则完全交给Mysql。所以以上几个层次的转换如果有字符集不匹配的情况,出现乱码就很容易理解了。说了半天,其实你只要把上述变量设置一致了,不管是直接在数据库里查看,还是在phpmyadmin里查看都不会出现中文乱码了。

假如你的系统和php网页是utf8编码,你可以将mysql的编码由默认的latin1改为utf8.

编辑mysql的配置文件,/etc/my.cnf,在[mysqld]中设置default-character-set=utf8即可。不过原来的数据,假如你用4.0,mysqldump出来的数据是latin1的编码,你再导入就会出现乱码。如果你原来的数据非常宝贵,那你还是用latin1编码吧。这样虽然从phpmyadmin或者数据库里看到的是乱码,但php存取出来中文是正确的。