zoukankan      html  css  js  c++  java
  • Oracle数据类型隐式转换小析

    测试使用环境:oracle 11g r1

    平常写sql语句时,大大咧咧,不太注意和数字有关的数据类型,有时例如 where c1=111 和 where c1='111'这样混用,却不曾想这里面另有蹊跷!

    数据准备:

    创建一个测试表 t_test3 , 字段 c1 varchar2(20), 字段上创建了索引,向该表中添加了100条数据,内容为 1-100数字。

    创建一个测试表 t_test4 , 字段 c1 number, 字段上创建了索引,向该表中添加了100条数据,内容为 1-100数字。

    测试:

    select * from t_test3 where c1='11'; -- 结果:观察执行计划,使用了索引

    select * from t_test3 where c1=11; -- 结果:观察执行计划,不使用索引,全表扫描,执行的时候做的转换为 (TO_NUMBER("C1")=11)

    结论:

    查询时,字符类型字段为查询条件赋值为数值类型时,隐式转换为该字段转换为数值型,不使用索引;

    测试:

    select * from t_test4 where c1=11; -- 结果:观察执行计划,使用了索引

    select * from t_test4 where c1='11'; -- 结果:观察执行计划,使用了索引,转换为 "C1"=11

    结论:

    查询时,数值类型字段为查询条件赋值为字符类型时,隐式转换为将字符转换为数值,继续使用索引;

    测试:

    向t_test3表中增加一条数据 insert into t_test3 (c1) values("lala"); commit;

    select * from t_test3 where c1=11; -- 结果:报错 ORA-01722: 无效数字

    结论:

    当字符类型字段中 既有数字值,又有字符值,查询条件直接写成数值会报错,因为隐式转换会将整个字段转换为数值型,由于字符型无法转换,故报错。

  • 相关阅读:
    css优先级及匹配原理
    [BZOJ1208]宠物收养所
    [BZOJ1588]营业额统计
    [AtCoder2558]Many Moves
    [POJ3416]Crossing
    [POJ3378]Crazy Thairs
    高精度大整数模板
    py3实现维吉尼亚加解密
    Codeforces 617E: XOR and Favorite Number(莫队算法)
    hdu 1695: GCD 【莫比乌斯反演】
  • 原文地址:https://www.cnblogs.com/dudu-java/p/5741575.html
Copyright © 2011-2022 走看看