当前位置:K88软件开发文章中心编程全书编程全书01 → 文章内容

Oracle中的中文排序方式

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 1:51:51

:2010-02-09 11:02:00

     1. 测试中文排序的数据库版本

  SQL> select * from v$version;
  BANNER
  --------------------------------------------------------------------------------
  Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
  PL/SQL Release 11.1.0.6.0 - Production
  CORE    11.1.0.6.0      Production
  TNS for Linux: Version 11.1.0.6.0 - Production
  NLSRTL Version 11.1.0.6.0 - Production

  2. 创建测试表

  create table player (id number(16, 0), name varchar2(30));

  3. 检查字符集配置

  确认数据库字符集 american_america.AL32UTF8
  SQL>  select  name,value$  from  props$;
  NAME                           VALUE$
  ------------------------------ ------------------------------
  DICT.BASE                      2
  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               AL32UTF8
  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_COMP                       BINARY
  NLS_LENGTH_SEMANTICS           BYTE
  NLS_NCHAR_CONV_EXCP            FALSE
  NLS_NCHAR_CHARACTERSET         AL16UTF16
  NLS_RDBMS_VERSION              11.1.0.6.0
  GLOBAL_DB_NAME                 ORA11G
  EXPORT_VIEWS_VERSION           8
  WORKLOAD_CAPTURE_MODE
  WORKLOAD_REPLAY_MODE
  DBTIMEZONE                     00:00
  32 rows selected.
  SQL>

  深入确认字符集
  SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,
  DECODE(TYPE#, 1,
  DECODE(CHARSETFORM, 1, 'VARCHAR2', 2, 'NVARCHAR2', 'UNKOWN'),
  9,
  DECODE(CHARSETFORM, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
  96,
  DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
  112,
  DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
  FROM SYS.COL$
  WHERE CHARSETFORM IN (1, 2)
  AND TYPE# IN (1, 9, 96, 112);

  确认操作系统字符集设置

  [ora11g@bj55 ~]$ export NLS_LANG=american_america.al32utf8

  4. 填写测试数据
  。。。。
  SQL> insert into player values (17, '下午啦');
  1 row created.
  SQL> insert into player values (20, '八千米死亡线');
  SQL> set pagesize 60
  SQL>  select * from player;
  ID NAME
  1 中文
  2 中文拼音
  3 笔画输入法
  4 一
  5 二
  6 三
  7 四
  8 五
  9 六
  10 七
  12 八1
  13 八2
  14 九1
  15 十
  16 测试啊
  17 下午啦
  20 八千米死亡线
  17 rows selected.
  SQL>

:2010-02-09 11:02:00

  5.  开始测试
      
发现三个查询语句返回的结果一致
  SQL> select * from player order by    nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
  ID NAME
  ---------- --------------------
  4 一
  15 十
  7 四
  10 七
  9 六
  8 五
  6 三
  3 笔画输入法
  13 八2
  14 九1
  12 八1
  5 二
  1 中文
  17 下午啦
  2 中文拼音
  16 测试啊
  20 八千米死亡线
  17 rows selected.

  SQL> select * from player order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
  ID NAME
  ---------- --------------------
  4 一
  15 十
  7 四
  10 七
  9 六
  8 五
  6 三
  3 笔画输入法
  13 八2
  14 九1
  12 八1
  5 二
  1 中文
  17 下午啦
  2 中文拼音
  16 测试啊
  20 八千米死亡线
  17 rows selected.
  SQL> select * from player order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
  ID NAME
  ---------- --------------------------------
  4 一
  15 十
  7 四
 10 七
  9 六
  8 五
  6 三
  3 笔画输入法
  13 八2
  14 九1
  12 八1
  5 二
  1 中文
  17 下午啦
  2 中文拼音
  16 测试啊
  20 八千米死亡线
  17 rows selected.
  囧,疑似碰上bug,切换到10gR2下看看

  SQL> select * from v$version;
  BANNER
  ----------------------------------------------------------------
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
  PL/SQL Release 10.2.0.1.0 - Production
  CORE    10.2.0.1.0    Production
  TNS for Linux: Version 10.2.0.1.0 - Production
  NLSRTL Version 10.2.0.1.0 - Production
  SQL> select * from player order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');

  ID NAME
  12 八1
  13 八2
  20 八千米死亡线
  3 笔画输入法
  16 测试啊
  5 二
  14 九1
  9 六
  10 七
  6 三
  15 十
  7 四
     8 五
  17 下午啦
  4 一
  1 中文
  2 中文拼音
  17 rows selected

  SQL> select * from player order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
  ID NAME
  ---------- ------------------------------
  4 一
  10 七
  5 二
  14 九1
  12 八1
  13 八2
  20 八千米死亡线
  15 十
  6 三
  17 下午啦
  8 五
  1 中文
  2 中文拼音
  9 六
  7 四
  16 测试啊
  3 笔画输入法
  21 测试服务器
  18 rows selected

  SQL> select * from player order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
  ID NAME
  ---------- ------------------------------
  4 一
  10 七
  5 二
  6 三
  17 下午啦
  8 五
  1 中文
  2 中文拼音
  14 九1
  12 八1
  13 八2
  20 八千米死亡线
  9 六
  15 十
  7 四
  16 测试啊
  3 笔画输入法
  21 测试服务器
  18 rows selected
  SQL>

  这个结果似乎比较符合预期结果:
  NLS_SORT=SCHINESE_RADICAL_M  按照部首排序
  NLS_SORT=SCHINESE_STROKE_M 按照笔画排序
  NLS_SORT=SCHINESE_PINYIN_M 按照拼音排序

上一页  [1] [2] 


Oracle中的中文排序方式