MYSQL中文排序问题
之所以写这篇博客,是因为前几天才碰到了这么一个问题,以前还不知道mysql有这么一个问题。
数据库使用的是mysql,字符集统一为utf-8,毕竟是人家瑞典开发的东西。
问题就是在排序的时候,发现查出来的人名没有顺序,本来以为很简单,在查询的时候,指定按照name排序就可以了,岂知实际一做才发现问题:mysql数据库使用字符集为utf-8,查询出来的中文根本不是按照拼音排序的。
我的解决方案大致是:
1、在sql语句中做手脚,在查询的时候排序。
2、如果不行查询出来,在程序中,自己写个方法排序。
3、最差的解决办法就是修改name字段,字符集使用gbk(或gb2312)
显然,第一种方法是最高效的,第三中方法是最差劲的。
由于程序限定的原因不能直接在程序中改,先做几个试验:
准备工作:
在mysql中建立一个数据库,就使用test吧,建两个表test1和test2,均设置两个字段,id和name,要求是test1.name这个字段使用的字符集为UTF-8,test2.name这个字段使用的字符集为GBK,输入几条数据,记得要输入中文啊。
建表语句:
(1)test1:
1 2 3 4 5 | CREATE TABLE 'test1' ( 'id' INT(4) UNSIGNED NOT NULL AUTO_INCREMENT, 'name' VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY ('id') ) ; |
(2)test2:
1 2 3 4 5 | CREATE TABLE 'test2' ( 'id' INT(4) UNSIGNED NOT NULL AUTO_INCREMENT, 'name' VARCHAR(20) CHARACTER SET gbk DEFAULT NULL, PRIMARY KEY ('id') ) ; |
另外修改表中字段的字符集可以使用:
1 | ALTER TABLE `test1` CHANGE `name` `name` VARCHAR (20) CHARACTER SET utf-8 NULL; |
插入数据后,这里不做介绍。
直接使用sql语句查询:分别对test1和test2表进行如下查询:
1 | SELECT name FROM test1 ORDER BY name; |
我们会发现test1表中的数据没有按照中文拼音排序,而使用了gbk字符集的test2查询结果令人很满意。
解决办法:
1 | SELECT name FROM test1 ORDER BY CONVERT(name USING gb2312) ASC; |
在mysql中试了一下,结果很令人满意。
结论是:查询的时候,通过convert函数,把查询出来的数据使用的字符集gb2312编码就可以了,然后使用convert之后的中文排序。但是如果真的去把表中字段的字符集改成gb2312,又会涉及到很多编码的问题,比如页面页面传值、从数据库中存取等等,很麻烦。只要在查询的时候,指定一下字符集,并不是真的把物理字段改成gb2312,只是在排序的时候改下输出的字符集,这样很简单,也解决了我们的问题。
数据库distinct返回不重复的多个字段结果 IIS上传大文件出错的解决办法