Oracle的中文排序问题

Posted 李爱戴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的中文排序问题相关的知识,希望对你有一定的参考价值。

环境

  • windows 7
  • Oracle 11g
  • PL/SQL

问题

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

直接使用**order by xxx desc**查询结果,如下所示:

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

解决

通过百度知道,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\');//按照部首排序

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

其他

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

参考文档

以上是关于Oracle的中文排序问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

SQL:按电子邮件域名排序

以下代码片段的时间复杂度是多少?

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段