ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 输入NVARCHRA2类型字符串

输入NVARCHRA2类型字符串

原创 Linux操作系统 作者:yangtingkun 时间:2009-01-07 22:15:04 0 删除 编辑

今天看到论坛的一个帖子,是关于NVARCHAR2字符串的。解答之后,顺便问了问同事,发现居然大家都不知道这个语法。所以这里简单描述一下。

 

 

其实语法非常检查,要指定一个国家字符集的字符串NCHARNVARCHAR2,只需要在字符串前面加上一个N就可以了。

举个例子:

SQL> CREATE TABLE T_NVARCHAR2 (ID NUMBER, NAME NVARCHAR2(30));

表已创建。

SQL> INSERT INTO T_NVARCHAR2 VALUES (1, N'ABC');

已创建 1 行。

SQL> DROP TABLE T_NVARCHAR2 PURGE;

表已删除。

SQL> CREATE TABLE T_NVARCHAR2 (ID NUMBER, NAME NVARCHAR2(30));

表已创建。

SQL> INSERT INTO T_NVARCHAR2 VALUES (1, N'ABC');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT DUMP(NAME, 16) FROM T_NVARCHAR2;

DUMP(NAME,16)
---------------------------------------------------------------------------------------
Typ=1 Len=6: 0,41,0,42,0,43

SQL> SELECT DUMP('ABC', 16) VAR, DUMP(N'ABC', 16) NVAR FROM DUAL;

VAR                                          NVAR
-------------------------------------------- ----------------------------------------
Typ=96 Len=3: 41,42,43                       Typ=96 Len=6: 0,41,0,42,0,43

如果对于VARCHAR2类型的表指定NVARCHAR2类型的查询,Oracle会自动进行隐式类型转换。

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));

表已创建。

SQL> CREATE INDEX IND_T_NAME ON T(NAME);

索引已创建。

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM ALL_OBJECTS;

已创建54020行。

SQL> COMMIT;

提交完成。

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

        ID NAME
---------- ------------------------------
     53170 T


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

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    30 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T          |     1 |    30 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T_NAME |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

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

   2 - access("NAME"='T')

Note
-----
   - dynamic sampling used for this statement

SQL> SELECT * FROM T WHERE NAME = N'T';

        ID NAME
---------- ------------------------------
     53170 T


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

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

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

   1 - filter(SYS_OP_C2C("NAME")=U'T')

Note
-----
   - dynamic sampling used for this statement

这个隐式转换过程会将列字段的VARCHAR2类型转换为NVARCHAR2类型,导致索引无法使用。如果想要这种情况下仍然可以使用索引,需要建立一个函数索引:

SQL> CREATE INDEX IND_T_NNAME ON T(TO_NCHAR(NAME));

索引已创建。

SQL> SELECT * FROM T WHERE NAME = N'T';

        ID NAME
---------- ------------------------------
     53170 T


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

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |   567 | 60669 |    48   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T           |   567 | 60669 |    48   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T_NNAME |   227 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

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

   2 - access(SYS_OP_C2C("NAME")=U'T')

Note
-----
   - dynamic sampling used for this statement

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-531728/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1954
  • 访问量
    10876497