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的排序规则,按拼音排序
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序,系统的默认排序方式为拼音排序
举例如下:
表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划、部首和拼音排序。
//按照笔划排序
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
//按照部首排序
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
//按照拼音排序,此为系统的默认排序方式
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');