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行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值