曾经讨论并验证过这个问题,记录在此,供大家参考。
在ZHS16GBK字符集下Oracle汉字排序依据亦是二进制编码非拼音!
1.确认系统的版本和字符集信息
1)数据库版本为Oracle 10.2.0.3
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
2)确认系统的字符集
SQL> col name for a30
SQL> col value$ for a30
SQL> col comment$ for a40
SQL> set lines 131
SQL> set pages 200
SQL> select * from sys.props$;
NAME VALUE$ COMMENT$
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET ZHS16GBK Character set
NLS_CALENDAR GREGORIAN Calendar system
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.3.0 RDBMS version for NLS parameters
GLOBAL_DB_NAME ORCL.REGRESS.RDBMS.DEV.US.ORAC Global database name
LE.COM
EXPORT_VIEWS_VERSION 8 Export views revision #
DBTIMEZONE 00:00 DB time zone
已选择27行。
可见数据库字符集为ZHS16GBK,其中重要的信息是“NLS_SORT BINARY”,就是这条信息指明了数据库的排序方式是按照二进制编码来完成的。
2.验证这个结论
1)创建测试表T并初始化四条记录
SQL> drop table t purge;
SQL> create table t (x varchar2(10), y varchar2(10), z number);
SQL> insert into t values ('甲','Jia',ascii('甲'));
SQL> insert into t values ('骨','Gu',ascii('骨'));
SQL> insert into t values ('文','Wen',ascii('文'));
SQL> insert into t values ('睿','Rui',ascii('睿'));
SQL> commit;
SQL> select * from t;
X Y Z
---------- ---------- ----------
甲 Jia 48343
骨 Gu 47559
文 Wen 52932
睿 Rui 61091
2)按照x列的内容进行排序
SQL> select * from t order by x;
X Y Z
---------- ---------- ----------
骨 Gu 47559
甲 Jia 48343
文 Wen 52932
睿 Rui 61091
结果很有说明性,这个结果是根据汉字的二进制ascii码完成的排序。此时汉字“睿”没有按照拼音的顺序进行排序。
3)使用nlssort强制汉字按照拼音顺序排序
SQL> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_PINYIN_M');
X Y Z
---------- ---------- ----------
骨 Gu 47559
甲 Jia 48343
睿 Rui 61091
文 Wen 52932
此时汉字即按照拼音的顺序完成了排序。
有关nlssort的用法请参考文章《【NLSSORT】改变Oralce 对简体汉字的排序规则(拼音、部首、笔画)》(http://space.itpub.net/519536/viewspace-627797)。
3.小结
希望通过本文澄清有关Oracle的汉字排序规则。不可想当然的认为在中文字符集下的汉字排序规则是按照拼音顺序进行排序。
Good luck.
secooler
10.09.12
-- The End --
在ZHS16GBK字符集下Oracle汉字排序依据亦是二进制编码非拼音!
1.确认系统的版本和字符集信息
1)数据库版本为Oracle 10.2.0.3
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
2)确认系统的字符集
SQL> col name for a30
SQL> col value$ for a30
SQL> col comment$ for a40
SQL> set lines 131
SQL> set pages 200
SQL> select * from sys.props$;
NAME VALUE$ COMMENT$
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET ZHS16GBK Character set
NLS_CALENDAR GREGORIAN Calendar system
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.3.0 RDBMS version for NLS parameters
GLOBAL_DB_NAME ORCL.REGRESS.RDBMS.DEV.US.ORAC Global database name
LE.COM
EXPORT_VIEWS_VERSION 8 Export views revision #
DBTIMEZONE 00:00 DB time zone
已选择27行。
可见数据库字符集为ZHS16GBK,其中重要的信息是“NLS_SORT BINARY”,就是这条信息指明了数据库的排序方式是按照二进制编码来完成的。
2.验证这个结论
1)创建测试表T并初始化四条记录
SQL> drop table t purge;
SQL> create table t (x varchar2(10), y varchar2(10), z number);
SQL> insert into t values ('甲','Jia',ascii('甲'));
SQL> insert into t values ('骨','Gu',ascii('骨'));
SQL> insert into t values ('文','Wen',ascii('文'));
SQL> insert into t values ('睿','Rui',ascii('睿'));
SQL> commit;
SQL> select * from t;
X Y Z
---------- ---------- ----------
甲 Jia 48343
骨 Gu 47559
文 Wen 52932
睿 Rui 61091
2)按照x列的内容进行排序
SQL> select * from t order by x;
X Y Z
---------- ---------- ----------
骨 Gu 47559
甲 Jia 48343
文 Wen 52932
睿 Rui 61091
结果很有说明性,这个结果是根据汉字的二进制ascii码完成的排序。此时汉字“睿”没有按照拼音的顺序进行排序。
3)使用nlssort强制汉字按照拼音顺序排序
SQL> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_PINYIN_M');
X Y Z
---------- ---------- ----------
骨 Gu 47559
甲 Jia 48343
睿 Rui 61091
文 Wen 52932
此时汉字即按照拼音的顺序完成了排序。
有关nlssort的用法请参考文章《【NLSSORT】改变Oralce 对简体汉字的排序规则(拼音、部首、笔画)》(http://space.itpub.net/519536/viewspace-627797)。
3.小结
希望通过本文澄清有关Oracle的汉字排序规则。不可想当然的认为在中文字符集下的汉字排序规则是按照拼音顺序进行排序。
Good luck.
secooler
10.09.12
-- The End --
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-673816/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/519536/viewspace-673816/