首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 中文欄位排序:筆畫、部首、拼音三種 NLS_SORT 實作

     編輯:Oracle 資料庫相關知識

Oracle 透過 NLSSORT 函數搭配 NLS_SORT 參數,支援中文按筆畫、部首、拼音排序,無需應用層邏輯。本文提供三種排序的標準 SQL 與參數說明。

核心 SQL 範本

-- 1. 筆畫排序
SELECT * FROM your_table
ORDER BY NLSSORT(chinese_col, 'NLS_SORT=SCHINESE_STROKE_M');

-- 2. 部首排序
SELECT * FROM your_table
ORDER BY NLSSORT(chinese_col, 'NLS_SORT=SCHINESE_RADICAL_M');

-- 3. 拼音排序
SELECT * FROM your_table
ORDER BY NLSSORT(chinese_col, 'NLS_SORT=SCHINESE_PINYIN_M');

參數後綴說明

後綴含義適用場景
_MMonolingual(單語言),效能較好,支援索引大多數業務排序
_BBilingual(雙語言),支援多語言混排,規則更複雜多語言環境
無後綴舊版相容,不建議新專案使用遷移舊系統

建立語言索引支援 ORDER BY 排序

-- 筆畫索引
CREATE INDEX idx_name_stroke ON your_table (NLSSORT(name, 'NLS_SORT=SCHINESE_STROKE_M'));

-- 拼音索引
CREATE INDEX idx_name_pinyin ON your_table (NLSSORT(name, 'NLS_SORT=SCHINESE_PINYIN_M'));

-- 查詢時指定相同 NLSSORT 即可使用索引
SELECT * FROM your_table
ORDER BY NLSSORT(name, 'NLS_SORT=SCHINESE_PINYIN_M');

Session 級設定預設排序(免寫 NLSSORT)

ALTER SESSION SET NLS_SORT = 'SCHINESE_PINYIN_M';
ALTER SESSION SET NLS_COMP = 'LINGUISTIC';  -- 必須設為 LINGUISTIC 才生效

-- 之後直接 ORDER BY name 即為拼音序
SELECT * FROM your_table ORDER BY name;

常見中文 NLS_SORT 值對照

排序方式NLS_SORT 值備註
簡體中文筆畫SCHINESE_STROKE_MGBK/UTF8 通用
簡體中文部首SCHINESE_RADICAL_M
簡體中文拼音SCHINESE_PINYIN_M最常用
繁體中文筆畫TCHINESE_STROKE_MBig5/UTF8 通用
繁體中文部首TCHINESE_RADICAL_M
繁體中文拼音/注音TCHINESE_PINYIN_M或用 RADICAL_M

效能提示

  • NLSSORT 每列計算一次,大量資料排序會消耗 CPU,建議**建立函數索引**
  • 若經常切換排序規則,考慮在應用層快取排序鍵值(如拼音欄位),查詢時直接 ORDER BY pinyin_col
  • NLS_COMP=LINGUISTIC 會影響所有字串比較(=、LIKE、BETWEEN),測試相容性後再開啟

中文排序不是「按碼點」,而是「按語言規則」。善用 NLSSORT + 函數索引,讓資料庫原生支援業務級中文排序。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved