oracle汉字排序

来源:互联网 发布:u盘重装mac 编辑:程序博客网 时间:2024/06/11 23:53
方法1
原文地址:http://blog.sina.com.cn/s/blog_442fbecc0100kk6n.html


程序开发 2009-11-19 14:08:12 阅读241 评论1 字号:

       oracle在9i之前是对汉字的排序是按照二进制编码进行排序的,很不适合我们的国情,在oracle9i之后,汉字的排序方式有了以下三种方式:
        1、使用拼音排序   NLS_SORT=SCHINESE_PINYIN_M
        2、使用笔画排序   NLS_SORT=SCHINESE_STROKE_M 第一顺序笔画,第二顺序部首;
        3、使用偏旁部首排序    NLS_SORT=SCHINESE_RADICAL_M 第一顺序部首,第二顺序笔画;
      
        这样,就可以在查询的时候,指定汉字的排序方式,设定方式可以分为以下三个级别:
        1、语句级别设置排序方式:
     
        按照笔划排序:
   
           select * from table order bynlssort(col,'NLS_SORT=SCHINESE_STROKE_M');
   
           按照部首排序:
     
         select * from table order bynlssort(col,'NLS_SORT=SCHINESE_RADICAL_M');
     
         按照拼音排序:
     
        select * from table order bynlssort(col,'NLS_SORT=SCHINESE_PINYIN_M');
        2、Session级别的设置,修改ORACLE字段的默认排序方式:
     
         按拼音:alter session set nls_sort = SCHINESE_PINYIN_M;
              按笔画:alter session set nls_sort = SCHINESE_STROKE_M;
              按偏旁:alter session set nls_sort = NLS_SORT=SCHINESE_RADICAL_M;

        3、修改系统参数(数据库所在操作系统):
               set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT (sh)setenv NLS_SORT SCHINESE_RADICAL_M (csh)  HKLC\SOFTWARE\ORACLE\home0\NLS_SORT (win注册表)


        网上有人说,oracle9i之后对于汉字的默认排序是拼音排序(
SCHINESE_PINYIN_M),但是经过我的实际验证,发现不是,排序比较乱,也不知道是不是按照二进制编码进行排序的。

        使用如下方法可以查看oracle的一些默认参数(注意标红的参数值):
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system
SQL>
SQL> select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_NCHAR_CHARACTERSET         UTF8
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_SORT                       BINARY
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               AL32UTF8
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
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_RDBMS_VERSION              10.2.0.1.0


方法2
原文地址:http://hi.baidu.com/hou_shaojun/item/d6f77bfc3b84f2e61b111ff6

CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS

V_COMPARE VARCHAR2(100);

V_RETURN VARCHAR2(4000);

 

FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS

BEGIN

RETURN NLSSORT(P_WORD,'NLS_SORT=SCHINESE_PINYIN_M');

END;

BEGIN

FOR I IN 1..LENGTH(P_NAME) LOOP

V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));

IF V_COMPARE >= F_NLSSORT('吖') AND V_COMPARE <= F_NLSSORT('驁') THEN

V_RETURN := V_RETURN ||'a';

ELSIF V_COMPARE >= F_NLSSORT('八') AND V_COMPARE <= F_NLSSORT('簿') THEN

V_RETURN := V_RETURN ||'b';

ELSIF V_COMPARE >= F_NLSSORT('嚓') AND V_COMPARE <= F_NLSSORT('錯') THEN

V_RETURN := V_RETURN ||'c';

ELSIF V_COMPARE >= F_NLSSORT('咑') AND V_COMPARE <= F_NLSSORT('鵽') THEN

V_RETURN := V_RETURN ||'d';

ELSIF V_COMPARE >= F_NLSSORT('妸') AND V_COMPARE <= F_NLSSORT('樲') THEN

V_RETURN := V_RETURN ||'e';

ELSIF V_COMPARE >= F_NLSSORT('发') AND V_COMPARE <= F_NLSSORT('猤') THEN

V_RETURN := V_RETURN ||'f';

ELSIF V_COMPARE >= F_NLSSORT('旮') AND V_COMPARE <= F_NLSSORT('腂') THEN

V_RETURN := V_RETURN ||'g';

ELSIF V_COMPARE >= F_NLSSORT('妎') AND V_COMPARE <= F_NLSSORT('夻') THEN

V_RETURN := V_RETURN ||'h';

ELSIF V_COMPARE >= F_NLSSORT('丌') AND V_COMPARE <= F_NLSSORT('攈') THEN

V_RETURN := V_RETURN ||'j';

ELSIF V_COMPARE >= F_NLSSORT('咔') AND V_COMPARE <= F_NLSSORT('穒') THEN

V_RETURN := V_RETURN ||'k';

ELSIF V_COMPARE >= F_NLSSORT('垃') AND V_COMPARE <= F_NLSSORT('擽') THEN

V_RETURN := V_RETURN ||'l';

ELSIF V_COMPARE >= F_NLSSORT('嘸') AND V_COMPARE <= F_NLSSORT('椧') THEN

V_RETURN := V_RETURN ||'m';

ELSIF V_COMPARE >= F_NLSSORT('拏') AND V_COMPARE <= F_NLSSORT('瘧') THEN

V_RETURN := V_RETURN ||'n';

ELSIF V_COMPARE >= F_NLSSORT('筽') AND V_COMPARE <= F_NLSSORT('漚') THEN

V_RETURN := V_RETURN ||'o';

ELSIF V_COMPARE >= F_NLSSORT('妑') AND V_COMPARE <= F_NLSSORT('曝') THEN

V_RETURN := V_RETURN ||'p';

ELSIF V_COMPARE >= F_NLSSORT('七') AND V_COMPARE <= F_NLSSORT('裠') THEN

V_RETURN := V_RETURN ||'q';

ELSIF V_COMPARE >= F_NLSSORT('亽') AND V_COMPARE <= F_NLSSORT('鶸') THEN

V_RETURN := V_RETURN ||'r';

ELSIF V_COMPARE >= F_NLSSORT('仨') AND V_COMPARE <= F_NLSSORT('蜶') THEN

V_RETURN := V_RETURN ||'s';

ELSIF V_COMPARE >= F_NLSSORT('侤') AND V_COMPARE <= F_NLSSORT('籜') THEN

V_RETURN := V_RETURN ||'t';

ELSIF V_COMPARE >= F_NLSSORT('屲') AND V_COMPARE <= F_NLSSORT('鶩') THEN

V_RETURN := V_RETURN ||'w';

ELSIF V_COMPARE >= F_NLSSORT('夕') AND V_COMPARE <= F_NLSSORT('鑂') THEN

V_RETURN := V_RETURN ||'x';

ELSIF V_COMPARE >= F_NLSSORT('丫') AND V_COMPARE <= F_NLSSORT('韻') THEN

V_RETURN := V_RETURN ||'y';

ELSIF V_COMPARE >= F_NLSSORT('帀') AND V_COMPARE <= F_NLSSORT('咗') THEN

V_RETURN := V_RETURN ||'z';

END IF;

END LOOP;

RETURN V_RETURN;

END;

测试一下:
SELECT F_TRANS_PINYIN_CAPITAL('侯韶君') FROM DUAL   
返回 hsj


select name from users t1 where (t1.name = ? or F_TRANS_PINYIN_CAPITAL(t1.name) = ?)

如果里面的?参数传递的是“侯韶君”,就是查询用户名首字母是hsj的人,


原创粉丝点击