Num1 int
Num2 varchar
Str1不能为null
Str2可null
例子1:
结果:124非常快,0.001~0.005秒出结果。3最慢,4~5秒出结果。
查询执行计划:124索引扫描。3全表扫描。
解释:首先四个23都产生隐式转换,隐式转换就是将大范围转换成小范围(大类型转换为小类型)
此例子就是将字符类型转换为数字类型
转换规则:
不以数字开头的字符串都转换成0
以数字开头的都进行截取,从第一个字符截取到第一个非数字内容为止。比如'123abc'会转换为123,'012abc'会转换为012也就是12,'5.3a66b78c'会转换为5.3,其他同理。
例子2:
总结:
所以,我们在写SQL时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。特别当查询的字段是字符串时,等号右边的条件一定要用引号引起来标明这是一个字符串,否则会造成索引失效触发全表扫描。
隐式转换不一定都导致索引失效,比如左面是数值类型,右边的字符就会转换成数值类型,不会导致索引失效。
隐式转换导致索引失效的原因:
比如左面是字符型,右边是数值型,字符转换成数值,而字符容易产生歧义,比如'10000f'和'10000'转换成数值类型相同,这样除了会导致查询结果错误还会导致索引失效。