总结:数据库中int类型的字段,查询的参数值可以是整型或者是字符串类型的;但是字符串类型的数据的字段,查询的参数值必须是字符串,否则会进行全表扫描,不走索引。
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换(把数据库中的字段数据类型转换成和查询参数一样的数据类型),可能导致查询无法使用索引。下面分析两种隐式转换的情况。
第一种情况:索引字段是varchar类型
select * from user where index_filed=2;
因为等号两侧类型不一致,因此会发生隐式转换,cast(index_filed as signed),然后和2进行比较。因为'2',' 2','2a'都会转化成2,故MySQL无法使用索引只能进行全表扫描,造成了慢查询的产生。
第二种情况:索引字段是int类型
select * from user where index_filed='2';
这次等号右侧是'2',注意带单引号哟,左侧的索引字段是int类型,因此也会发生隐式转换,但因为int类型的数字只有2能转化为'2',是唯一确定的。所以虽然需要隐式转换,但不影响使用索引,不会导致慢查询。
问题如下下所示:
问题描述
where 条件语句里,字段属性和赋给的条件,当数据类型不一样,这时候是没法直接比较的,需要进行一致转换
默认转换规则是:
①:不同类型全都转换为浮点型(下文都说成整型了,一个意思)
②:如果字段是字符,条件是整型,那么会把表中字段全都转换为整型(也就是上面图中的问题,下面有详细解释)
转换总结:
1:字符转整型
①:字符开头的一律为0
②:数字开头的,直接截取到第一个不是字符的位置
2:时间类型转换
①:date 转 datetime 或者 timestamp 追加 00:00:00
②:date 转 time 无意义,直接为 00:00:00
③:datetime 或者 timestamp 转 date 直接截取date字段
④:datetime 或者 timestamp 转 time 直接截取time字段
⑤:time 转 datetime 或者 timestamp 按照字符串进行截取 23:12:13 -> 2023-12-13(这个后文有讨论)
⑥:cast函数只能转datetime,不能转timestamp
如果按照timestamp来理解,因为timestamp是有范围的('1970-01-01 00:00:01.000000' to'2038-01-19 03:14:07.999999'),所以只能是2023年,而不能是1923年
对于不符合的时间值,如10:12:32等,会变为 0000-00-00 或为 空
⑦:time和datetime转换为数字时,会变为双精度,加上ms(版本不同不一样)