Oracle数据类型的隐性转换

WBOY
풀어 주다: 2016-06-07 15:03:27
원래의
1371명이 탐색했습니다.

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 ********************************************************* declare vv varchar2(10):='123'; begin UPDATE /*+ RULE*/ tt2 set numcol=1 where charcol=vv; end; / Rows Row Source Operation --

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

 

    *********************************************************

    declare

    vv varchar2(10):='123';

    begin

    UPDATE /*+ RULE*/ tt2 set numcol=1 where charcol=vv;

    end;

    /

    Rows Row Source Operation

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

    0 UPDATE

    0 INDEX RANGE SCAN IDX_CHAR (object id 28748)

    *********************************************************

    Rows为0,说明没有行被更新,'123   '与'123'理应为不同的值,这样的结果合理,然而在RBO方式下IDX_CHAR索引被使用,可见并没有对charcol进行隐性的转换。

    可是,将char类型字段与字符串常量进行比较呢?

    *********************************************************

    SQL> select /*+ RULE */ * from tt2 where charcol='123';

    NUMCOL CHARCOL VARCHARCOL

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

    1 123 1A

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=HINT: RULE

    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TT2'

    2 1 INDEX (RANGE SCAN) OF 'IDX_CHAR' (NON-UNIQUE)

    *********************************************************

    居然有数据返回,并且IDX_CHAR 索引被使用,岂不是'123       '与'123'相等,同样的where语句,同样是字符串'123',因为隐性转换产生了不同的逻辑,原来char与字符串常量比较时,隐性将常量按 char的字段类型转换,'123'转换成char(10)则变成了'123    ',看来使用char类型得小心了,两种不同的结果其实就对应着我们在应用开发中将SQL放在存储过程中还是放在中间件或前台代码中。

    做了这么多例证,掌握了常用的转换规律后,我们在数据库开发中应该注意些什么呢:

    1、 表结构设计中字段的类型以及数据库代码变量的类型应慎用char类型,采用这种类型的数据必须满足两个条件:1)非空;2)有固定长度。

    2、 规范编码,尽量避免隐性转换,比较中使用相同类型。

    在代码中构造动态SQL时,对字符串类型字段的比较中常有这种情况发生,实际上构造的语句是将字符与数字进行比较。

    v_SQL:=' ...  where varcharcol='||v_str;

    正确的做法应该是

    v_SQL:=' ...  where varcharcol='''||v_str||'''';

    3、 某些标记性或开关意义的字段,取值范围诸如(0,1),(1、2、3)等,尽量使用NUMBER,而不要使用varchar2。

    如果where varcharcol='1'误写为 where varcharcol=1将可能造成严重的性能问题,频繁隐性类型转换还可能造成不可预期的ORA-06512

    错误,而 where numcol=1 误写为 where numcol='1'则没有太多不利影响

  [1] [2] [3] 

Oracle数据类型的隐性转换

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!