关于MySQL数据库的数据类型发生隐形转换的问题咨询
网友的问题:
1.RDS对于int类型索引使用问题,如:tb中有主键id,普通索引tid,在执行SQL:select * from tb where id = 2 order by id 时,
extra为空,这里的id值没带引号,如果带上引号extra也为空。
2.当 select * from tb where tid = 2 order by tid,tid为普通索引,这时tid的值带引号和不带引号就会有区别,带引号时extra会提示额外
的排序,不带引号时extra为空,这是怎么一回事?
mysqlops的回答:
1.当字段类型为:INT;
2. 传入的值为:字符串类型;
3.WHERE条件中的整型字段的传入值用单引号或双引号;
上述描述的前提条件下,会对把传入的 值类型 转换为 字段定义的数据类型,故WHERE 条件是可以使用到索引的,但从数据库表读出
到内存块后的值会被 转换为 传入值的数据类型,从而导致ORDER BY无法使用到索引解释为何ORDER BY ID没有外部排序 或extra的
内容为空,那是因为WHERE ID='2' 按主键查询只能查到唯一的一条记录,故不需要排序;
ORDER BY tid 时,WHERE tid='2' 按普通索引去查找的话,能查找到的数据条数会大于1条,加上数据类型隐形转换了,为此需要再
额外进行排序和extra部分有内容显示;
总结:
数据库中要尽量避免发生数据隐形转换的危险,极端情况下可能会发生偶尔的WHERE条件都无法使用到索引,故开发规范非常重要。