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: 无效数字

    结论:

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

  • 相关阅读:
    使用discourse 作为社区工具
    dremio schema 更新的问题
    go-mysql-server 新版本发布
    开发一个dremio user_agent 解析函数
    java 几个不错的user_agent 解析工具包
    Docker Swarm 高可用详解
    用Docker Swarm实现容器服务高可用
    Docker 1.12 :认识 Swarm 模式下的节点崩溃处理
    Linux下磁盘分区调整(在不使用LVM的情况下)
    docker-swarm----多机容器管理
  • 原文地址:https://www.cnblogs.com/dudu-java/p/5741575.html
Copyright © 2011-2022 走看看