hex()返回不同的值,是编码设置的原因?
相同的SQL:SELECT hex('好');
我在phpMyAdmin环境下执行,返回的是:E5A5BD
我在mysql命令行下,返回的是:BAC3
我写个简单的存储过程,将结果写到表中,在mysql命令行下调用存储过程,插入的数据也是6位的
为什么这样?如何保持一致?
我想取4位的结果,可以减少文件的大小,对查询速度有影响吗?
4位的可以满足汉字/日文/韩文等非拉丁文的需求吗?
[解决办法]
为什么这样?字符集问题
show variables like 'char%';
[解决办法]
字符集设置的原因。
参考下贴中的检查方法,贴出你的字符集设置。
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
[解决办法]
- 确切点说,我认为是客户端字符集影响的,因为你这个语句没有经过服务器,直接在客户端执行。
- “好”字的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)
[解决办法]
在 windows 下,mysql 客户端还有一个“代码页”的影响,即这个 cmd 窗口右键->属性->选项,可以看到代码页面,它影响客户端的标准输入。
[解决办法]
[mysql]
default-character-set=utf8
重新启动MYSQL服务
导出数据,在统一的字符集下重新建立表,再导入数据