开发者社区> 问答> 正文

关于RDS数据类型发生隐形转换的问题咨询

         关于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条件都无法使用到索引,故开发规范非常重要。

展开
收起
mysqlops 2014-07-25 17:38:03 9860 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像