在Oracle 9i之前,汉字排序是基于二进制编码。从Oracle 9i起,引入了更加灵活的汉字排序方式,主要有三种:
-
拼音排序 (
NLS_SORT=SCHINESE_PINYIN_M
) -
笔画排序 (
NLS_SORT=SCHINESE_STROKE_M
) -
偏旁部首排序 (
NLS_SORT=SCHINESE_RADICAL_M
)
这些排序方式可以在不同的级别上设置,包括语句级别、会话级别和系统级别,以满足不同的应用需求。
1. 语句级别设置排序方式
-
按笔画排序
SELECT * FROM table ORDER BY nlssort(col, 'NLS_SORT=SCHINESE_STROKE_M'); -
按部首排序
SELECT * FROM table ORDER BY nlssort(col, 'NLS_SORT=SCHINESE_RADICAL_M'); -
按拼音排序
SELECT * FROM table ORDER BY nlssort(col, 'NLS_SORT=SCHINESE_PINYIN_M');
2. Session级别设置
-
按拼音
ALTER SESSION SET nls_sort = SCHINESE_PINYIN_M; -
按笔画
ALTER SESSION SET nls_sort = SCHINESE_STROKE_M; -
按偏旁
ALTER SESSION SET nls_sort = SCHINESE_RADICAL_M;
3. 系统参数设置
-
Linux/Unix
export NLS_SORT=SCHINESE_RADICAL_M -
Windows
在注册表中设置:HKLC\SOFTWARE\ORACLE\home0\NLS_SORT=SCHINESE_RADICAL_M
检查设置
为了验证排序设置是否生效,可以使用以下查询来查看Oracle的一些默认参数:
SELECT * FROM nls_database_parameters WHERE parameter LIKE '%NLS_SORT%';
案例:
建表:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR2(50),
score INT
);
插入数据:
INSERT INTO students (id, name, score) VALUES (1, '张三', 88);
INSERT INTO students (id, name, score) VALUES (2, '李四', 95);
INSERT INTO students (id, name, score) VALUES (3, '王五', 76);
INSERT INTO students (id, name, score) VALUES (4, '赵六', 82);
INSERT INTO students (id, name, score) VALUES (5, '陈七', 91);
演示不同的排序方式
按拼音排序:
按笔画排序:
按偏旁部首排序: