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:
总结:
- 当操作符左右两边的数据类型不一致时,会发生隐式转换。
- 当where查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。
- 当where查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。
- 字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。
所以,我们在写SQL时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。特别当查询的字段是字符串时,等号右边的条件一定要用引号引起来标明这是一个字符串,否则会造成索引失效触发全表扫描。
隐式转换不一定都导致索引失效,比如左面是数值类型,右边的字符就会转换成数值类型,不会导致索引失效。
隐式转换导致索引失效的原因:
比如左面是字符型,右边是数值型,字符转换成数值,而字符容易产生歧义,比如'10000f'和'10000'转换成数值类型相同,这样除了会导致查询结果错误还会导致索引失效。