首页 » 建站技术 » DreamHost » 浏览内容

PHP 存取 MySQL 乱码问题


2008-09-05 08:29:22 3,187 0 发表评论 字体: 作者:C.K.
标签: mysql

体验版 88 元,个人版 128 元,多用户版 288元个人版160元升级到多用户版。

MySQL 的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:

查看字符集:

mysql> SHOW VARIABLES LIKE 'character_set_%';
显示字符集设置如下:

+————————–+—————————-+
  | Variable_name | Value |
  +————————–+—————————-+
  | character_set_client | latin1 |
  | character_set_connection | latin1 |
  | character_set_database | latin1 |
  | character_set_results | latin1 |
  | character_set_server | latin1 |
  | character_set_system | utf8 |
  | character_sets_dir | /usr/share/mysql/charsets/ |
  +————————–+—————————-+


查看排序方式(Collation)

mysql> SHOW VARIABLES LIKE 'collation_%';
显示默认值:

+———————-+——————-+
  | Variable_name | Value |
  +———————-+——————-+
  | collation_connection | latin1_swedish_ci |
  | collation_database | latin1_swedish_ci |
  | collation_server | latin1_swedish_ci |
  +———————-+——————-+
上面列出的值就是系统的默认值。如果你奇怪系统怎么默认是latin1的瑞典语排序方式,原因是MySQL由瑞典的T.c.X.DataKonsultAB公司(目前公司名称为MySQL AB)开发,不用再多说了吧。
当我们按照原来的方式通过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处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。

    网站统计 Statistics

    • 创建时间: 2005年1月3日 距今4947 天
    • 日志总数: 2461
    • 评论总数: 630
    • 标签总数: 654
    • 链接总数: 273
    • 最后更新: 2017-7-1 18:16:33
    • 您是本站第 13721073 位访客

    广告区 Guǎng Gào