隐式转换

本文探讨了MySQL中不同数据类型的索引使用情况,特别是int类型字段作为索引时,带与不带引号查询的区别及其对排序的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MySQL对于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条件都无法使用到索引,故开发规范非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值