環境
- 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')),未進行測試;
- 根據網上的說法,拼音排序對於多音字的處理還是有問題的,未進行測試;