曾经讨论并验证过这个问题,记录在此,供大家参考。在ZHS16GBK字符集下Oracle汉字排序依据亦是二进制编码非拼音!1.确认系统的版本和字符集信息1)数据库版本为Oracle 10.2.0.3SQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - ProdPL/SQL Release 10.2.0.3.0 - ProductionCORE 10.2.0.3.0 ProductionTNS for 32-bit Windows: Version 10.2.0.3.0 - ProductionNLSRTL Version 10.2.0.3.0 - Production2)确认系统的字符集SQL> col name for a30SQL> col value$ for a30SQL> col comment$ for a40SQL> set lines 131SQL> set pages 200SQL> select * from sys.props$;NAME VALUE$ COMMENT$------------------------------ ------------------------------ ----------------------------------------DICT.BASE 2 dictionary base tables version #DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespaceDEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespaceDEFAULT_TBS_TYPE SMALLFILE Default tablespace typeNLS_LANGUAGE AMERICAN LanguageNLS_TERRITORY AMERICA TerritoryNLS_CURRENCY $ Local currencyNLS_ISO_CURRENCY AMERICA ISO currencyNLS_NUMERIC_CHARACTERS ., Numeric charactersNLS_CHARACTERSET ZHS16GBK Character setNLS_CALENDAR GREGORIAN Calendar systemNLS_DATE_FORMAT DD-MON-RR Date formatNLS_DATE_LANGUAGE AMERICAN Date languageNLS_SORT BINARY Linguistic definitionNLS_TIME_FORMAT HH.MI.SSXFF AM Time formatNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp formatNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone formatNLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone formatNLS_DUAL_CURRENCY $ Dual currency symbolNLS_COMP BINARY NLS comparisonNLS_LENGTH_SEMANTICS BYTE NLS length semanticsNLS_NCHAR_CONV_EXCP FALSE NLS conversion exceptionNLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character setNLS_RDBMS_VERSION 10.2.0.3.0 RDBMS version for NLS parametersGLOBAL_DB_NAME ORCL.REGRESS.RDBMS.DEV.US.ORAC Global database nameLE.COMEXPORT_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 610912)按照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.secooler10.09.12-- The End --
oracle 中文字符串 二进制,【ORDER BY】在ZHS16GBK字符集下Oracle汉字排序依据亦是二进制编码非拼音...
最新推荐文章于 2021-11-15 16:50:08 发布