使用sort命令排序方式 Oracle中的中文排序方式
Oracle中的中文排序方式
测试中文排序的数据库版本
SQL> select * from v$version;
BANNER
Oracle Database g Enterprise Edition Release Production
PL/SQL Release Production
CORE Production
TNS for Linux: Version Production
NLSRTL Version Production
创建测试表
create table player (id number( ) name varchar ( ));
检查字符集配置
确认数据库字符集 american_america AL UTF
SQL> select name value$ from props$;
NAME VALUE$
DICT BASE
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_EDITION ORA$BASE
Flashback Timestamp TimeZone GMT
TDE_MASTER_KEY_ID
DEFAULT_TBS_TYPE SMALLFILE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS
NLS_CHARACTERSET AL UTF
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD MON RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH MI SSXFF AM
NLS_TIMESTAMP_FORMAT DD MON RR HH MI SSXFF AM
NLS_TIME_TZ_FORMAT HH MI SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD MON RR HH MI SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_P BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL UTF
NLS_RDBMS_VERSION
GLOBAL_DB_NAME ORA G
EXPORT_VIEWS_VERSION
WORKLOAD_CAPTURE_MODE
WORKLOAD_REPLAY_MODE
DBTIMEZONE :
rows selected
SQL>
深入确认字符集
SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET
DECODE(TYPE#
DECODE(CHARSETFORM VARCHAR NVARCHAR UNKOWN )
DECODE(CHARSETFORM VARCHAR NCHAR VARYING UNKOWN )
DECODE(CHARSETFORM CHAR NCHAR UNKOWN )
DECODE(CHARSETFORM CLOB NCLOB UNKOWN )) TYPES_USED_IN
FROM SYS COL$
WHERE CHARSETFORM IN ( )
AND TYPE# IN ( );
确认操作系统字符集设置
[ora g@bj ~]$ export NLS_LANG=american_america al utf
填写测试数据
SQL> insert into player values ( 下午啦 );
row created
SQL> insert into player values ( 八千米死亡线 );
SQL> set pagesize
SQL> select * from player;
ID NAME
中文
中文拼音
笔画输入法
一
二
三
四
五
六
七
八
八
九
十
测试啊
下午啦
八千米死亡线
rows selected
SQL>
开始测试 发现三个查询语句返回的结果一致
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_RADICAL_M );
ID NAME
一
十
四
七
六
五
三
笔画输入法
八
九
八
二
中文
下午啦
中文拼音
测试啊
八千米死亡线
rows selected
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_STROKE_M );
ID NAME
一
十
四
七
六
五
三
笔画输入法

八
九
八
二
中文
下午啦
中文拼音
测试啊
八千米死亡线
rows selected
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_PINYIN_M );
ID NAME
一
十
四
七
六
五
三
笔画输入法
八
九
八
二
中文
下午啦
中文拼音
测试啊
八千米死亡线
rows selected
囧 疑似碰上bug 切换到 gR 下看看
SQL> select * from v$version;
BANNER
Oracle Database g Enterprise Edition Release Prod
PL/SQL Release Production
CORE Production
TNS for Linux: Version Production
NLSRTL Version Production
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_PINYIN_M );
ID NAME
八
八
八千米死亡线
笔画输入法
测试啊
二
九
六
七
三
十
四
五
下午啦
一
中文
中文拼音
rows selected
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_STROKE_M );
ID NAME
一
七
二
九
八
八
八千米死亡线
十
三
下午啦
五
中文
中文拼音
六
四
测试啊
笔画输入法
测试服务器
rows selected
SQL> select * from player order by nlssort(name NLS_SORT=SCHINESE_RADICAL_M );
ID NAME
一
七
二
三
下午啦
五
中文
中文拼音
九
八
八
八千米死亡线
六
十
四
测试啊
笔画输入法
测试服务器
rows selected
SQL>
这个结果似乎比较符合预期结果
NLS_SORT=SCHINESE_RADICAL_M 按照部首排序
NLS_SORT=SCHINESE_STROKE_M 按照笔画排序
lishixinzhi/Article/program/Oracle/201311/17664