【NLSSORT】改變Oralce 對簡體漢字的排序規則(拼音、部首、筆畫)

secooler發表於2010-02-23
如果資料庫字符集選用的是ZH16GBK,那麼使用order by預設是按照漢字的“二進位制編碼”順序進行排序的。有方法改變這個預設規則麼?
答案是肯定的,Oracle針對簡體中文提供三種排序方法,主要是圍繞“拼音”、“部首”和“筆畫數”展開的。
透過實驗,給大家展示一下NLSSORT在改變簡體漢字排序規則方面的魅力。

1.在Oracle的官方文件中關於排序有如下描述
“Linguistic Sorts”

其中表“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函式的描述參考


9.小結
NSLSORT函式在國際化支援上提供了一個非常好的排序解決方案。在具體應用環境下有其重要的意義。善用之。

Good luck.

secooler
10.02.24

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-627797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章