Oracle 大小写区分的处理 中文排序

Oracle 大小写区分的处理

查询数据的时候。

SQL Server 默认 不区分大小写。 如果要区分,就要额外的设置。

Oracle 默认 区分大小写。如果不要区分,就要额外的设置。



下面就是 Oracle 的明细部分了。



首先是测试表/数据

SQL> CREATE TABLE tab (

2    id  INT,

3    val VARCHAR2(10)

4  );



表已创建。



SQL> INSERT INTO tab

2    SELECT 1, 'ABC123' FROM DUAL UNION ALL

3    SELECT 2, 'abc234' FROM DUALUNION ALL

4    SELECT 3, 'Abc345' FROM DUAL UNION ALL

5    SELECT 4, 'aBC456' FROM DUALUNION ALL

6    SELECT 5, 'aBc567' FROM DUAL;



已创建5行。



=操作的例子

SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   val = 'abc123';



未选定行



SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   val = 'ABC123';



       ID VAL

---------- ----------

        1 ABC123



由上面的结果可以看出,默认情况下,Oracle 大小写敏感的。



下面通过设置环境变量,让Oracle对大小写不敏感



SQL> ALTER SESSION SET NLS_COMP=ANSI;



会话已更改。



SQL> ALTER SESSION SET NLS_SORT=binary_ci;



会话已更改。



SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   val = 'abc123';



       ID VAL

---------- ----------

        1 ABC123



LIKE操作的例子

SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

  6   val LIKE 'a%';



       ID VAL

---------- ----------

        2 abc234

        4 aBC456

        5 aBc567



默认是大小写敏感。



SQL> ALTER SESSION SET NLS_COMP=ANSI;



会话已更改。



SQL> ALTER SESSION SET NLS_SORT=binary_ci;



会话已更改。



会话更改以后,条件是  val = 的,可以实现大小写不敏感

但是对于 val LIKE 的查询,还是大小写敏感的。



解决办法,使用正则表达式的方式来变通的处理。



SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   REGEXP_LIKE (val, '^a', 'i');



       ID VAL

---------- ----------

        1 ABC123

        2 abc234

        3 Abc345

        4 aBC456

        5 aBc567



注1:REGEXP_LIKE 的第3个参数'i' 表示大小写敏感。

注2:对于环境变量NLS_COMP 与NLS_SORT的设置,会影响REGEXP_LIKE 执行的结果(假如第3个参数不填写的话)。





默认情况下:

SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   REGEXP_LIKE (val, '^a');



       ID VAL

---------- ----------

        2 abc234

        4 aBC456

        5 aBc567



ALTER SESSION SET … 之后



SQL> SELECT

2    *

3  FROM

4    tab

5  WHERE

6   REGEXP_LIKE (val, '^a');



       ID VAL

---------- ----------

        1 ABC123

        2 abc234

        3 Abc345

        4 aBC456

        5 aBc567







排序的例子




SQL> SELECT

2    *

3  FROM

4    Tab

5  ORDER BY

6    val;



       ID VAL

---------- ---------

        1 ABC123

        3 Abc345

        4 aBC456

        5 aBc567

        2 abc234



默认排序为大小写敏感



SQL> ALTER SESSION SET NLS_COMP=ANSI;



会话已更改。



SQL> ALTER SESSION SET NLS_SORT=binary_ci;



会话已更改。



SQL> SELECT

2    *

3  FROM

4    Tab

5  ORDER BY

6    val;



       ID VAL

---------- ----------

        1 ABC123

        2 abc234

        3 Abc345

        4 aBC456

        5 aBc567



关于中文汉字的排序




SQL> TRUNCATE TABLE Tab;



表被截断。



SQL>

SQL> INSERT INTO tab

2    SELECT 1, '一' FROM DUAL UNION ALL

3    SELECT 2, '二' FROM DUAL UNION ALL

4    SELECT 3, '三' FROM DUAL UNION ALL

5    SELECT 4, '四' FROM DUAL UNION ALL

6    SELECT 5, '五' FROM DUAL;



已创建5行。



SQL> commit;



提交完成。





-- 按照拼音来排序

SQL> SELECT

2    *

3  FROM

4    Tab

5  ORDER BY NLSSORT(val, 'NLS_SORT=SCHINESE_PINYIN_M');



       ID VAL

---------- ----------

        2 二

        3 三

        4 四

        5 五

        1 一



-- 按照笔画数来排序

SQL> SELECT

2    *

3  FROM

4    Tab

5  ORDER BY NLSSORT(val, 'NLS_SORT=SCHINESE_STROKE_M');



       ID VAL

---------- ----------

        1 一

        2 二

        3 三

        5 五

        4 四



-- 按照偏旁部首来排序



SQL> INSERT INTO tab

2    SELECT 6, '人' FROM DUAL UNION ALL

3    SELECT 7, '十' FROM DUAL UNION ALL

4    SELECT 8, '土' FROM DUAL UNION ALL

5    SELECT 9, '士' FROM DUAL;



已创建4行。



SQL> commit;



提交完成。



SQL> SELECT

2    *

3  FROM

4    Tab

5  ORDER BY NLSSORT(val, 'NLS_SORT=SCHINESE_RADICAL_M');



       ID VAL

---------- ----------

        1 一

        2 二

        3 三

        5 五

        6 人

        7 十

        4 四

        8 土

        9 士



已选择9行。

你可能感兴趣的:(oracle)