测试中文排序的数据库版本
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_americaALUTF
SQL> select namevalue$ from props$;
NAME VALUE$
DICTBASE
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 ALUTF
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DDMONRR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HHMISSXFF AM
NLS_TIMESTAMP_FORMAT DDMONRR HHMISSXFF AM
NLS_TIME_TZ_FORMAT HHMISSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DDMONRR HHMISSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET ALUTF
NLS_RDBMS_VERSION
GLOBAL_DB_NAME ORAG
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 SYSCOL$
WHERE CHARSETFORM IN ( )
AND TYPE# IN ( );
确认操作系统字符集设置
[orag@bj ~]$ export NLS_LANG=american_americaalutf
填写测试数据
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(nameNLS_SORT=SCHINESE_RADICAL_M);
ID NAME
一
十
四
七
六
五
三
笔画输入法
八
九
八
二
中文
下午啦
中文拼音
测试啊
八千米死亡线
rows selected
SQL> select * from player order by nlssort(nameNLS_SORT=SCHINESE_STROKE_M);
ID NAME
一
十
四
七
六
五
三
笔画输入法
八
九
八
二
中文
下午啦
中文拼音
测试啊
八千米死亡线
rows selected
SQL> select * from player order by nlssort(nameNLS_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(nameNLS_SORT=SCHINESE_PINYIN_M);
ID NAME
八
八
八千米死亡线
笔画输入法
测试啊
二
九
六
七
三
十
四
五
下午啦
一
中文
中文拼音
rows selected
SQL> select * from player order by nlssort(nameNLS_SORT=SCHINESE_STROKE_M);
ID NAME
一
七
二
九
八
八
八千米死亡线
十
三
下午啦
五
中文
中文拼音
六
四
测试啊
笔画输入法
测试服务器
rows selected
SQL> select * from player order by nlssort(nameNLS_SORT=SCHINESE_RADICAL_M);
ID NAME
一
七
二
三
下午啦
五
中文
中文拼音
九
八
八
八千米死亡线
六
十
四
测试啊
笔画输入法
测试服务器
rows selected
SQL>
这个结果似乎比较符合预期结果
NLS_SORT=SCHINESE_RADICAL_M 按照部首排序
NLS_SORT=SCHINESE_STROKE_M 按照笔画排序
NLS_SORT=SCHINESE_PINYIN_M 按照拼音排序