`

Oracle 对汉字的order by排序规则

阅读更多
关于oracle order by排序:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#i1008198
引用

Oracle provides the following types of sorts:
Binary sort
Monolingual linguistic sort
Multilingual linguistic sort
注:后两种可统一为linguistic(语言的) sort

关于NLS:National Language Support
Setting NLS Parameters:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch3globenv.htm#NLSPG003
查看数据库NLS相关信息:
select * from nls_database_parameters;

查看当前会话NLS相关信息:
select * from nls_session_parameters;

关于Oracle汉字order by:
http://www.kods.net/common-statement-oracle/
引用

37. Chinese is how to sort?

Prior to Oracle9i, the Chinese are in accordance with the sort of binary encoding.
Added in oracle9i in accordance with pinyin, radical, stroke order functions. Set NLS_SORT value
SCHINESE_RADICAL_M in accordance with the radical (first order), stroke (second order) Sort
SCHINESE_STROKE_M in accordance with the stroke (first order), radicals (second order) Sort
SCHINESE_PINYIN_M sorted according to Pinyin




汉字排序须综合考虑数据库字符集、NLS_SORT。

查看版本信息:
select * from v$version;

查看数据库字符集:
SELECT userenv('language') FROM dual;

如果字符集为ZHS16GBK/ZH16GBK,那么使用order by默认是按照汉字的拼音顺序进行排序的;如果为其他(如UTF8),那么汉字的排序是按照BINARY排序的。



数据库字符集不为中文字符集的情况下怎样让其按照汉字拼音排序?答案是设置NLS_SORT。
NLS_SORT specifies the collating sequence for ORDER BY queries
查看NLS_SORT:
引用
查看整个数据库的:
select value from nls_database_parameters where parameter='NLS_SORT';

查看当前会话的:
select value from nls_session_parameters where parameter='NLS_SORT';

字符集为中文字符集、NLS_SORT为BINARY时,汉字是按汉字拼音排序;
字符集为非中文字符集(如UTF8)、NLS_SORT为BINARY时,汉字按二进制编码(BINARY)排序。
所以,对非中文字符集库:
可通过设置其NLS_SORT来实现汉字的定制化排序;改变当前会话的NLS_SORT:
ALTER session SET NLS_SORT = SCHINESE_PINYIN_M

上述语句只可改变当前session的NLS_SORT;执行"ALTER system SET NLS_SORT = SCHINESE_PINYIN_M"欲改变整个数据库的NLS_SORT,提示"ORA-02096: 此选项的指定初始化参数不可修改",为什么?因为该参数无法在数据库启动的情况下动态修改:
    http://www.unix-center.net/bbs/viewthread.php?tid=13853
    http://kr.forums.oracle.com/forums/thread.jspa?threadID=211579
到底怎么修改整个数据库的NLS_SORT那?有待继续考证(参照这个帖子做考证:http://forums.oracle.com/forums/thread.jspa?threadID=917930)
也可在查询时指定NLS_SORT:
引用

1、使用拼音排序
  select * from t order by nlssort(field,'NLS_SORT=SCHINESE_PINYIN_M');
2、使用笔画排序
  select * from t order by nlssort(field,'NLS_SORT=SCHINESE_STROKE_M');
3、使用偏旁部首排序
  select * from t order by nlssort(field,'NLS_SORT=SCHINESE_RADICAL_M');
总:
http://www.kods.net/oracle-database-scheduling-problem-by-the-chinese-alphabet-nls-sort-set/
引用

Prior to Oracle9i, the Chinese is based on binary coding to sort. The oracle9i added in accordance with the phonetic, radical, stroke sorting.
1, set parameter values NLS_SORT
SCHINESE_RADICAL_M accordance with the radical (first order), stroke (second order) to sort
SCHINESE_STROKE_M accordance with the stroke (first order), radical (second order) to sort
SCHINESE_PINYIN_M sorted according to Pinyin
2, Session-level settings, modify the default ORACLE field Sort by:
According to Pinyin: alter session set nls_sort = SCHINESE_PINYIN_M;
According to stroke: alter session set nls_sort = SCHINESE_STROKE_M;
According to the radical: alter session set nls_sort = NLS_SORT = SCHINESE_RADICAL_M;
3, the statement level is set Sort by:
Oracle according to alphabetical order
Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_STROKE_M');
Oracle accordance with the radical sort
Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_RADICAL_M');
Oracle sorted according to Pinyin
Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_PINYIN_M');
4, modify the system parameters (database where the operating system):
set NLS_SORT = SCHINESE_RADICAL_M; export NLS_SORT (sh)
setenv NLS_SORT SCHINESE_RADICAL_M (csh)
HKLC \ SOFTWARE \ ORACLE \ home0 \ NLS_SORT (win registry)




关于NLS_SORT:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams130.htm
关于NLSSORT函数:
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions111.htm#SQLRF00678
关于SCHINESE_RADICAL_M、SCHINESE_STROKE_M、SCHINESE_PINYIN_M等:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/applocaledata.htm#g683050



改变Oralce 对简体汉字的排序规则:
http://space.itpub.net/519536/viewspace-627797
引用

如果数据库字符集选用的是ZH16GBK,那么使用order by默认是按照汉字的拼音顺序进行排序的。有方法改变这个默认规则么?
答案是肯定的,Oracle针对简体中文提供三种排序方法,主要是围绕“拼音”、“部首”和“笔画数”展开的。
通过实验,给大家展示一下NLSSORT在改变简体汉字排序规则方面的魅力。

1.在Oracle的官方文档中关于排序有如下描述
“Linguistic Sorts”
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/applocaledata.htm#sthref2000
其中表“Table A-15 Multilingual LInguistic Sorts”中我们关注一下有关中文排序的内容(前三条与简体中文排序有关,后两条与繁体中文排序有关):
1)SCHINESE_RADICAL_M
Simplified Chinese sort based on radical as primary order and number of strokes order as secondary order
注释:简体中文按照第一顺序是“部首”第二顺序是“笔画数”进行排序;

2)SCHINESE_STROKE_M
Simplified Chinese sort uses number of strokes as primary order and radical as secondary order
注释:简体中文按照第一顺序“笔画数”是第二顺序是“部首”进行排序;

3)SCHINESE_PINYIN_M
Simplified Chinese PinYin sorting order
注释:简体中文按照“拼音”进行排序;

4)TCHINESE_RADICAL_M
Traditional Chinese sort based on radical as primary order and number of strokes order as secondary order
注释:繁体中文按照第一顺序是“部首”第二顺序是“笔画数”进行排序;

5)TCHINESE_STROKE_M
Traditional Chinese sort uses number of strokes as primary order and radical as secondary order. It supports supplementary characters.
注释:繁体中文按照第一顺序“笔画数”是第二顺序是“部首”进行排序;

2.创建实验表T,并初始化六条记录
sec@secooler> create table t (x varchar2(10));
sec@secooler> insert into t values ('侯');
sec@secooler> insert into t values ('你');
sec@secooler> insert into t values ('做');
sec@secooler> insert into t values ('拉');
sec@secooler> insert into t values ('推');
sec@secooler> insert into t values ('拆');
sec@secooler> commit;
sec@secooler> select * from t;

X
------------------------------







6 rows selected.

3.确认数据库版本和数据库字符集
sec@secooler> select * from v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

sec@secooler> select userenv('language') from dual;

USERENV('LANGUAGE')
-----------------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

4.在此环境下,查看默认的汉字排序规则
sec@secooler> select * from t order by x;

X
------------------------------







6 rows selected.

可见,此时的默认汉字排序规则是“拼音”。

5.使用nlssort强制按照拼音排序的方法
sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_PINYIN_M');

X
------------------------------







6 rows selected.

6.使用nlssort强制按照“部首”(第一顺序)和“笔画数”(第二顺序)排序的方法
sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_RADICAL_M');

X
------------------------------







6 rows selected.

单人旁的汉字在前,提手旁汉字在后;单人旁的三个汉字进一步又是按照笔画数多少进行的排序。

7.使用nlssort强制按照“笔画数”(第一顺序)和“部首”(第二顺序)排序的方法
sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_STROKE_M');

X
------------------------------







6 rows selected.

可见,越往后的汉字的笔画数越多。

8.Oracle官方文档中关于NSLSORT函数的描述参考
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions111.htm#SQLRF00678

9.小结
NSLSORT函数在国际化支持上提供了一个非常好的排序解决方案。在具体应用环境下有其重要的意义。善用之。

Good luck.


分享到:
评论
1 楼 yljf1314 2012-03-02  

相关推荐

Global site tag (gtag.js) - Google Analytics