0%

中文排序问题

查看 oracle 相关信息

查看 NLS 相关信息

数据库级别

select * from nls_database_parameters;

会话级别

select * from nls_session_parameters;

查看版本信息

select * from v$version;

查看数据库字符集

SELECT userenv(‘language’) FROM dual;

中文排序

中文排序选项

  • SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
  • SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
  • SCHINESE_PINYIN_M 按照拼音排序

设置排序方式

  1. 当前会话级别

alter session set nls_sort = SCHINESE_PINYIN_M;

  1. 语句级别

select * from dept order by nlssort(name,’NLS_SORT=SCHINESE_PINYIN_M’);

  1. 系统级别(在数据库端设置)

set NLS_SORT=SCHINESE_PINYIN_M ;

  1. 设置环境变量(网上有这种说法,但是并不生效)

-Duser.language=zh -Duser.region=CN -Duser.country=CN

  1. 使用 after logon trigger

    NLS_SORT

定义

NLS_SORT 定义了 order by 语句的整理顺序:

  1. 如果 NLS_SORT 为 BINARY sort,则 order by排序基于 字符的numeric value顺序来进行排序(binary排序要求更少的系统负载)
  2. 如果 NLS_SORT 为 linguistic sortorder by排序基于 字符的linguistic sort定义的排序顺序。(Most (but not all) languages supported by the NLS_LANGUAGE parameter also support a linguistic sort with the same name.)

NLS_SORT 的默认值是由 NLS_LANGUAGE 决定的。

索引

索引是根据binary order key排序的。
当将 NLS_SORT 设置为非 BINARY SORT 时: 优化器会在执行计划中,进行全表扫描和全排序操作。
当将 NLS_SORT 设置为 BINARY SORT时: 优化器可以使用索引来进行 order by 排序。

若想建立 按拼音排序的索引: 可以建立 linguistic index

CREATE INDEX nls_index ON my_table (NLSSORT(name, ‘NLS_SORT = SCHINESE_PINYIN_M’));

资料

http://wuaner.iteye.com/blog/681614
https://blog.csdn.net/qincidong/article/details/8998284
https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch3globenv.htm#NLSPG003
https://docs.oracle.com/cd/B19306_01/server.102/b14225/applocaledata.htm
https://www.oracle.com/technetwork/testcontent/sort-083215.html