数据库 按拼音查询

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的排序规则,按拼音排序



在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');
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值