首页 > 新闻系统 > 编程天地 > 文章正文

字符串中的字符大小写敏感处理方法

2008-04-23 10:02:29 来源:中国自学编程网 作者:佚名 点击:
在Oracle中,命令和对象名称都是大小写不敏感的,因为Oracle在处理语句时,将所有的名称和命令全部转化为大写。

  在Oracle中,命令和对象名称都是大小写不敏感的,因为Oracle在处理语句时,将所有的名称和命令全部转化为大写。

    但是对于字符串中的字符,无论是比较还是排序,都是大小写敏感的。这在Oracle是默认方式,但不是唯一的方式。
下面看一个简单的例子:

SQL> CREATE TABLE T (NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO T VALUES (’A’);

已创建 1 行。

SQL> INSERT INTO T VALUES (’a’);

已创建 1 行。

SQL> INSERT INTO T VALUES (’B’);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE INDEX IND_T_NAME ON T(NAME);

索引已创建。

看一下默认情况下的排序和查询结果:

SQL> SELECT * FROM T ORDER BY NAME;

NAME
------------------------------
A
B
a

SQL> SELECT * FROM T WHERE NAME = ’A’;

NAME
------------------------------
A

这是最正常不过的结果了,下面修改会话默认的排序方式:

SQL> ALTER SESSION SET NLS_SORT = BINARY_CI;

会话已更改。

SQL> SELECT * FROM T ORDER BY NAME;

NAME
------------------------------
A
a
B

SQL> SELECT * FROM T WHERE NAME = ’A’;

NAME
------------------------------
A

    可以看到,通过设置排序方法为BINARY_CI,已经实现了对排序的大小写不敏感,但是查询语句中仍然是大小写敏感的,下面进一步修改比较方式:

SQL> ALTER SESSION SET NLS_COMP = LINGUISTIC;

会话已更改。

SQL> SELECT * FROM T ORDER BY NAME;

NAME
------------------------------
A
a
B

SQL> SELECT * FROM T WHERE NAME = ’A’;

NAME
------------------------------
A


    现在已经达到了大小写不敏感查询的目的了,这是由于设置比较方式是基于语义的,而不是基于二进制的,而语言方式下A和a是没有区别的。 

    虽然目的达到了,但是还是要说明一下,这里虽然实现了对大小写不敏感的查询,但是这个结果的实现与表面看到的现象并不完全相同。 

    从查询语句上看,似乎只是对NAME进行一下判断就可以了,并未对列进行任何的操作,而实际上并非如此,下面看看这种情况下的执行计划:

SQL> SET AUTOT ON EXP
SQL> SELECT * FROM T WHERE NAME = ’A’;

NAME
------------------------------
A
a

执行计划
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 17 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(NLSSORT("NAME",’nls_sort=’’BINARY_CI’’’)=HEXTORAW(’6100’)
)

Note
-----
- dynamic sampling used for this statement 
9 7 3 1 2 4 8 :

精彩推荐
焦点大图推荐
本类热门文章

论坛美图

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203