测试使用环境: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: 无效数字

结论:

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

最新文章

  1. hdu 4859 海岸线 Bestcoder Round 1
  2. sqlserver 2005 数据误删恢复
  3. Scrapy源码学习(一)
  4. mac下如何查看指定端口被谁占用并且杀死该进程
  5. SharePoint需要开启的网站集功能
  6. POJ 3373 Changing Digits 好蛋疼的DP
  7. Docker 多主机网络总结(非常全)
  8. Kubernetes 中的核心组件与基本对象概述
  9. 第一篇:安装Android Studio问题及其解决方案
  10. js获取子节点和修改input的文本框内容
  11. Sonatype Nexus 2.11.1-01 使用入门
  12. 如何使用webpack打包项目
  13. Unix线程概念、控制原语、属性
  14. tomcat源码阅读之Server和Service接口解析
  15. Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!
  16. 「Vue」程序式路由导航用法
  17. Golang基础学习总结
  18. [Selenium]点击下拉框之后,从下拉列表选择元素进行点击很容易失败
  19. 爬虫之Requests: 让 HTTP 服务人类
  20. mysql默认字符编码设置教程:my.ini设置字符编码

热门文章

  1. (DFS、全排列)POJ-2718 Smallest Difference
  2. html图片预览
  3. SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确 ||尝试在数据库 5 中提取逻辑页 (1:1640) 失败
  4. 一次线上http接口调用不通相关的解决过程
  5. PHP store session with couchbase
  6. 网易云课堂JS笔记
  7. 关于<form>标签
  8. Java Base64 类
  9. 关于解析P D X P 协议的心得
  10. 百度star编程赛-练习1