数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle中的中文排序方式


发布日期:2019年02月14日
 
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_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 按照拼音排序

               

上一篇:Oracle11g新特性点评之RMAN

下一篇:关于oracle的备份策略