相同的SQL:SELECT hex('好');
我在phpMyAdmin环境下执行,返回的是:E5A5BD
我在mysql命令行下,返回的是:BAC3
我写个简单的存储过程,将结果写到表中,在mysql命令行下调用存储过程,插入的数据也是6位的为什么这样?如何保持一致?
我想取4位的结果,可以减少文件的大小,对查询速度有影响吗?
4位的可以满足汉字/日文/韩文等非拉丁文的需求吗?

解决方案 »

  1.   

    为什么这样?字符集问题
    show variables like 'char%'; 
      

  2.   

    我在命令行下,将字符集设置成phpMyAdmin的设置后,select的结果还是4位。
      

  3.   

    字符集设置的原因。参考下贴中的检查方法,贴出你的字符集设置。
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  4.   

    ==========phpMyAdmin==========
    character_set_client utf8 
    character_set_connection utf8 
    character_set_database utf8 
    character_set_filesystem binary 
    character_set_results utf8 
    character_set_server latin1 
    character_set_system utf8 
    ==========mysqld==========
    +--------------------------+--------+
    | Variable_name            | Value  |
    +--------------------------+--------+
    | character_set_client     | gbk    |
    | character_set_connection | gbk    |
    | character_set_database   | latin1 |
    | character_set_filesystem | binary |
    | character_set_results    | gbk    |
    | character_set_server     | latin1 |
    | character_set_system     | utf8   |
    +--------------------------+--------+
      

  5.   

    - 确切点说,我认为是客户端字符集影响的,因为你这个语句没有经过服务器,直接在客户端执行。
    - “好”字的utf8是3字节存储数据的,所以hex结果是有“六位”。你可以使用ultraEditor等可以转换编码及查看十六进制的编辑器来测试各种编码下的对应十六进制。
    - 要显示多语言的话,建议使用 utf8。当然,其实数据库里存放什么编码没关系,只要客户端能够解释你存储的数据就可以。
    - 你说“在mysql命令行下调用存储过程,插入的数据也是6位的”,这时候已经和服务器打交道了,影响就不只是“客户端”的设置了,可能表或库的字符集就是 utf8 的。改成别的字符集就会变成别的位数。
    - mysql 里可以用 convert 函数来转移字符编码,测试的时候很好用:
    mysql> select hex(convert('好' using utf8)), convert('好' using utf8);
    +-------------------------------+--------------------------+
    | hex(convert('好' using utf8)) | convert('好' using utf8) |
    +-------------------------------+--------------------------+
    | E5A5BD                        | 好                       |
    +-------------------------------+--------------------------+
    1 row in set (0.00 sec)
    mysql> select hex(convert('好' using gb2312)), convert('好' using gb2312);
    +---------------------------------+----------------------------+
    | hex(convert('好' using gb2312)) | convert('好' using gb2312) |
    +---------------------------------+----------------------------+
    | 3F3F                            | ??                         |
    +---------------------------------+----------------------------+
    1 row in set (0.00 sec)mysql> select hex(convert('好' using latin1)), convert('好' using latin1);
    +---------------------------------+----------------------------+
    | hex(convert('好' using latin1)) | convert('好' using latin1) |
    +---------------------------------+----------------------------+
    | BAC3                            | 好                         |
    +---------------------------------+----------------------------+
    1 row in set (0.00 sec)
      

  6.   

    在 windows 下,mysql 客户端还有一个“代码页”的影响,即这个 cmd 窗口右键->属性->选项,可以看到代码页面,它影响客户端的标准输入。
      

  7.   

    [mysql]default-character-set=utf8
    重新启动MYSQL服务导出数据,在统一的字符集下重新建立表,再导入数据