MySQL 的字符集支持(Character SetSupport)有两个方面:字符集(Characterset)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
查看字符集:
mysql> SHOW VARIABLES LIKE'character_set_%';
显示字符集设置如下:
+--------------------------+----------------------------+
查看排序方式(Collation)
mysql> SHOW VARIABLES LIKE'collation_%';
显示默认值:
+----------------------+-------------------+
上面列出的值就是系统的默认值。如果你奇怪系统怎么默认是latin1的瑞典语排序方式,原因是MySQL由瑞典的T.c.X.DataKonsultAB公司(目前公司名称为MySQLAB)开发,不用再多说了吧。
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES ‘utf8′;
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
再试试看,正常了吧?
就是连接之后加个查询
$this->query(”SET NAMES ‘utf8'”);
character_set_client,character_set_results,character_set_connection三个运行变量是造成乱码的关键。mysql把客户端提交的查询由character_set_client转换为character_set_connection
,由于默认网页提交的查询是gb2312(表单页面meta里可以看到),而mysql默认将其当作utf8(可以查到此时的character_set_client=utf8),所以必然乱码。同理,mysql返回的结果是已经转换成character_set_results编码的(与表的编码无关),同样默认是utf8,而网页页面把它当gb2312处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。
本文来自: 电脑教程网(www.itvip.org)详细出处参考:http://www.itvip.org/database/mysql/20071103/MySQL_luanmawenti_423.html