您的位置信息之舟电 脑硬件栏目首页数据库类MySQL 收藏本页

→ 解决PHP存取MySQL 4.1乱码问题

www.kepusoft.com 信息之舟电脑软件应用栏目

    信息之舟电脑软件应用栏目编者按: QUOTE:从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章 “Character Set Support”后终于找到了解决方法并测试通过。

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

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

    CODE:

    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/ |
    +————————–+—————————-+
    7 rows in set (0.00 sec)

    mysql> SHOW VARIABLES LIKE ‘collation_%’;
    +———————-+——————-+
    | Variable_name | Value |
    +———————-+——————-+
    | collation_connection | latin1_swedish_ci |
    | collation_database | latin1_swedish_ci |
    | collation_server | latin1_swedish_ci |
    +———————-+——————-+
    3 rows in set (0.00 sec)

    上面列出的值就是系统的默认值。如果你奇怪系统怎么默认是latin1的瑞典语排序方式,原因是MySQL由瑞典的T.c.X.DataKonsultAB公司(目前公司名称为MySQL AB)开发,不用再多说了吧。
    当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

    SET NAMES ‘utf8′;

    它相当于下面的三句指令:

    CODE:

    SET character_set_client = utf8;
    SET character_set_results = utf8;
    SET character_set_connection = utf8;
    再试试看,正常了吧?

    就是连接之后加个查询

    CODE:

    $this->query(”SET NAMES ‘utf8'”);
    看了手册第10章觉得主要还是Character Sets的问题。
    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处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。
    以上这个例子是utf8字符集,用此方法,设置为gbk,即可解决

www.kepusoft.com 信息之舟电脑之家收集整理推荐文章