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: 无效数字
结论:
当字符类型字段中 既有数字值,又有字符值,查询条件直接写成数值会报错,因为隐式转换会将整个字段转换为数值型,由于字符型无法转换,故报错。
最新文章
- hdu 4859 海岸线 Bestcoder Round 1
- sqlserver 2005 数据误删恢复
- Scrapy源码学习(一)
- mac下如何查看指定端口被谁占用并且杀死该进程
- SharePoint需要开启的网站集功能
- POJ 3373 Changing Digits 好蛋疼的DP
- Docker 多主机网络总结(非常全)
- Kubernetes 中的核心组件与基本对象概述
- 第一篇:安装Android Studio问题及其解决方案
- js获取子节点和修改input的文本框内容
- Sonatype Nexus 2.11.1-01 使用入门
- 如何使用webpack打包项目
- Unix线程概念、控制原语、属性
- tomcat源码阅读之Server和Service接口解析
- Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!
- 「Vue」程序式路由导航用法
- Golang基础学习总结
- [Selenium]点击下拉框之后,从下拉列表选择元素进行点击很容易失败
- 爬虫之Requests: 让 HTTP 服务人类
- mysql默认字符编码设置教程:my.ini设置字符编码