首页 > 代码库 > sql 汉字按照首字母排序

sql 汉字按照首字母排序

 

  • SQL

mysql  

我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法通过order by关键字正确排序。

经过网上查找,网上的办法大多是针对使用utf8字符集的数据库,主要的方法有:

1)直接转换字段为gbk,数据表某字段client_name的字符编码是utf8_general_ci; 比如:

SELECT  *  FROM  `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC;   SELECT * FROM `client_info_msg` ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC;

或者干脆将相应字段改为gbk字符集。

某字段name的字符编码是latin1_swedish_ci;

select  *  from `tbl` order by birary(name) asc    select * from `tbl` order by birary(name) asc

我在我的数据库测试了上面的方法,或者直接按字段排序,都不行,主要是排序结果不理想。

 

2)查表法
创建一个新表,用来存储拼音声母和使用该声母的汉字首字的对应关系。然后写一个函数,每次排序时通过转换为gbk再查表的方法得到字段内容首字的声母的方法。http://hudeyong926.iteye.com/blog/1127094

这个方法我也试了,太麻烦,而且针对我的数据库,也不能正确排序。


后来,我查询了汉字编码的一些资料,发现GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了)。根据这个原理,直接按字段排序就应该可以的(我的数据库使用Latin1 字符集,存的汉字本来就是GBK内码),但我试了以后发现不行。参考上面方法2的查表法,我把字段内容转换为16进制编码,再排,就OK了!

这就是最终的办法:

SELECT * FROM table ORDER BY hex( chinese_field )   SELECT * FROM table ORDER BY hex( chinese_field )

简单吧!

 

我现在想查询table表。要求name字段的名字按照英文大写字母A-Z的顺序排列

sqlserver
select id,name from table order by upper(name) --按照字母排序
ORDER BY name COLLATE Chinese_PRC_CS_AS_WS --大陆简体字UNICODE的排序规则,按拼音排序