Oracle 透過 NLSSORT 函數搭配 NLS_SORT 參數,支援中文按筆畫、部首、拼音排序,無需應用層邏輯。本文提供三種排序的標準 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');
| 後綴 | 含義 | 適用場景 |
|---|---|---|
_M | Monolingual(單語言),效能較好,支援索引 | 大多數業務排序 |
_B | Bilingual(雙語言),支援多語言混排,規則更複雜 | 多語言環境 |
| 無後綴 | 舊版相容,不建議新專案使用 | 遷移舊系統 |
-- 筆畫索引
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');
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 值 | 備註 |
|---|---|---|
| 簡體中文筆畫 | SCHINESE_STROKE_M | GBK/UTF8 通用 |
| 簡體中文部首 | SCHINESE_RADICAL_M | |
| 簡體中文拼音 | SCHINESE_PINYIN_M | 最常用 |
| 繁體中文筆畫 | TCHINESE_STROKE_M | Big5/UTF8 通用 |
| 繁體中文部首 | TCHINESE_RADICAL_M | |
| 繁體中文拼音/注音 | TCHINESE_PINYIN_M | 或用 RADICAL_M |
NLSSORT 每列計算一次,大量資料排序會消耗 CPU,建議**建立函數索引**ORDER BY pinyin_colNLS_COMP=LINGUISTIC 會影響所有字串比較(=、LIKE、BETWEEN),測試相容性後再開啟中文排序不是「按碼點」,而是「按語言規則」。善用
NLSSORT+ 函數索引,讓資料庫原生支援業務級中文排序。