Oracle的中文排序问题

探讨Oracle11g中按字母序倒序展示数据的问题,解析默认二进制排序的原因,及如何使用NLSSORT函数实现拼音、笔画和部首排序,并提及创建linguistic index以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • windows 7
  • Oracle 11g
  • PL/SQL

问题

对oracle中的一张表中的某个字段进行排序,要求按照字母序进行倒序展示;

直接使用**order by xxx desc**查询结果,如下所示:
728240-20190103175052419-344578826.jpg

排序结果并没有按照字母序,而且不知道这个是什么顺序?

解决

通过百度知道,oracle 9i之前对中文的排序默认是按照二进制排序的,11g中查询到的默认排序也是二进制,可以通过下面的sql语句查询到:

select * from NLS_SESSION_PARAMETERS;

查询结果中的'NLS_SORT'的值是'BINARY',也就是二进制排序;

但是在oracle 9i之后,新增了几种新的排序选择,分别是按照'拼音'排序、按照'中文部首'排序、按照'中文笔画'进行排序.

select * from 表名 order by NLSSORT(排序字段,'SCHINESE_PINYIN_M');//按照拼音排序
select * from 表名 order by NLSSORT(排序字段,' SCHINESE_STROKE_M');//按照笔画排序
select * from 表名 order by NLSSORT(排序字段,' SCHINESE_RADICAL_M');//按照部首排序

问题中的查询语句,使用拼音排序之后的结果如下所示:

728240-20190103175103335-53358733.jpg

其他

  • 根据网上的说法,使用新的排序方法不会使用索引,会进行全表扫描,解决方法是,在此列上建立linguistic index.例如:CREATE INDEX nls_index ON my_table (NLSSORT(name, 'NLS_SORT = SCHINESE_PINYIN_M')),未进行测试;
  • 根据网上的说法,拼音排序对于多音字的处理还是有问题的,未进行测试;

参考文档

转载于:https://www.cnblogs.com/liaidai/p/10215949.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值