欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle的中文排序问题

程序员文章站 2022-05-14 10:21:47
[TOC] 环境 windows 7 Oracle 11g PL/SQL 问题 对oracle中的一张表中的某个字段进行排序,要求按照字母序进行倒序展示; 直接使用 查询结果,如下所示: 排序结果并没有按照字母序,而且不知道这个是什么顺序? 解决 通过百度知道,oracle 9i之前对中文的排序默认 ......

目录

环境

  • windows 7
  • oracle 11g
  • pl/sql

问题

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

直接使用**order by xxx desc**查询结果,如下所示:
Oracle的中文排序问题

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

解决

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

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

Oracle的中文排序问题

其他

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

参考文档