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

结论:

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

 

posted @ 2016-08-05 15:36  dudu_java  阅读(1448)  评论(0编辑  收藏  举报