总结:数据库中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(版本不同不一样)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐