原出处http://blog.csdn.net/ExSystem/article/details/3706702

网上有很多网友都说MySQL里面的中文乱码问题特别的烦人,我也是这样觉得的,我打算从一开始就让网站全部采用Unicode(UTF-8)编码的,认为这样才规范。

然而后来发现,光光在建立数据库或者建立数据表的时候采用设定在SQL语句里面的

CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'

这样的方法,是不完美的,虽然说这样能够让我的数据在自己的网页里面正常显示多国语言文字,但是无论用phpMyAdmin还是命令行方式mysql程序显示得到的数据都是非拉丁文字部分乱码(对于我们来说,大多数就是汉字变成乱码了,当然)。

究其原因,原来是MySQL对于字符集的支持有四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection),可见MySQL(4.0+版本)在设计的时候在对于多语言的支持就是不错的,只能怪我们没有仔细设置了(要么或者说它设置太复杂了,呵呵)。

知道这个,那么问题的原因就简单了,现在我们的程序(网页)是UTF-8的,同时连接层的是latin1(MySQL的默认设置),然后数据库的又是utf8的,然后,我们从数据库取数据,原来utf8格式的字符被latin1的连接层一处理,不是拉丁文的部分全部变成“?”字符,然后当然显示到网页的还是“?”。这样就有乱码了。

那应该怎么解决呢?其实只要改改设置,还有在数据库操作的时候注意一个小问题就可以了。

首先要设置my.ini文件,添加下面的内容就是了,当然确保数据库设置为utf8和utf8_unicode_ci。

[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8
default-collation = utf8_unicode_ci
[mysql]
default-character-set = utf8

然后,还要在连接数据库完成的时候设置client character set,比如用mysqli的时候就是要

$mConn = new mysqli();
$mConn->connect(/*...*/);
$mConn->set_charset('utf8');
//...

当然mysql库也有相应的函数,就是mysql_set_charset,方法类似。

即使在mysql_conn()之后加上mysql_set_charset('utf8');

这样,就完美解决了phpMyAdmin和MySQL的乱码问题。