之所以写这篇博客,是因为前几天才碰到了这么一个问题,以前还不知道mysql有这么一个问题。
数据库使用的是mysql,字符集统一为utf-8。
本来已经完成了,但是系统使用的时候,发现查出来的人名没有顺序,本来以为很简单,在查询的时候,指定按照name排序就可以了,岂知实际一做才发现问题:mysql数据库使用字符集为utf-8,查询出来的中文根本不是按照拼音排序的。
我的解决方案大致是:
① 在sql语句中做手脚,在查询的时候排序。
② 如果不行查询出来,在程序中,自己写个方法排序。
③
最差的解决办法就是修改name字段,字符集使用gbk(或gb2312)
显然,第一种方法是最高效的,第三中方法是最差劲的。
不能直接在程序中改,先做几个试验:
试验一:mysql中文排序
准备工作:
在mysql中建立一个数据库,就使用test吧,建两个表test1和test2,均设置两个字段,id和name,要求是test1.name这个字段使用的字符集为UTF-8,test2.name这个字段使用的字符集为GBK,输入几条数据,记得要输入中文啊。
建表语句:
(1)test1:
CREATE TABLE `test1`
(
`id` int(4)
unsigned NOT NULL
auto_increment,
`name`
varchar(20) character set utf8 default NULL,
PRIMARY KEY
(`id`)
) ;
(2)test2:
CREATE TABLE `test2`
(
`id` int(4)
unsigned NOT NULL
auto_increment,
`name`
varchar(20) character set gbk default NULL,
PRIMARY KEY
(`id`)
) ;
另外修改表中字段的字符集可以使用:alter table `test1` change `name` `name` varchar
(20) CHARACTER SET utf-8 NULL;
输入数据:
(缅怀一下伟人!!!呵呵。)
test2表中也一样。
进行试验:
直接使用sql语句查询:分别对test1和test2表进行如下查询:
select name from test1 order by name;
结果:
很明显,test1表中的数据没有按照中文拼音排序,而使用了gbk字符集的test2查询结果令人很满意。
问题:
在一个j2ee项目中,字符编码是一个很令人头痛的问题,为了和国际接轨,适应多语种,大部分项目都采用了UTF-8字符集,但是mysql中对采用UTF-8的存储中文的字段查询,却不尽如人意。
问题的解决之道:
在网上查了许久,也没有一个能够解决这个问题的方法。
我构造的sql语句是:select name from test1 order by convert(name
using gb2312) asc;
在mysql中试了一下,结果很令人满意。
结论是:查询的时候,通过convert函数,把查询出来的数据使用的字符集gb2312编码就可以了,然后使用convert之后的中文排序。但是如果真的去把表中字段的字符集改成gb2312,又会涉及到很多编码的问题,页面传值啊,从数据库中存取啊,很麻烦。只要在查询的时候,指定一下字符集,并不是真的把物理字段改成gb2312,很简单。
我马上把这个方法告诉老大,准备静候佳音了。谁知问题随之又来了,convert函数在hibernate中不认。大概是因为convert这个函数是mysql自己提供的一个方法。这怎么办?
我的第一反应就是使用第二个方案,查出来,自己排序。