标签:ams from 默认 二进制 tps mysq 一个 描述 十六进制
之前工作的时候,写错了一条sql,判断某varchar类型的字段=2,结果匹配了很多条数据,比如
select tt from table1 where tt = 2;
结果集tt中 有 “2sssss”、“2dddddd”等。当时是很好奇,后面去查阅了资料,才发现这是mysql隐式转换导致的。
那么什么是隐式转换呢?
官方对mysql的隐式转换规则描述如下:
在where的条件语句中,字段类型与赋予条件的数据类型不一样是,需要进行一致转换才可以比较。
默认的转换规则是:
总结:
例子:
比如tt(varchar),如果写条件为tt=0,则会把所有的tt字段的字符全都转换成为整型,再和0去比较,再返回匹配的行。若tt字段有索引,此场景无法使用索引只能进行全表扫描,造成了慢查询的产生。
注意:
mysql的隐式类型规则较复杂,依赖mysql隐式转换很容易出现各种想象不到的问题,且隐式类型转换非常耗费mysql服务器性能,因此不推荐这样使用,因此在进行条件搜索的时候,注意使用的搜索值与字段的类型一致。
参考资料https://www.cnblogs.com/wtcl/p/9085427.html、https://blog.csdn.net/weixin_34233618/article/details/92471842、https://blog.devopszen.com/mysql_params
标签:ams from 默认 二进制 tps mysq 一个 描述 十六进制
原文地址:https://www.cnblogs.com/smallzhen/p/14057805.html