MySQL隐式转换还有这问题?

文章讨论了MySQL中的隐式类型转换问题,尤其是在where子句中,可能导致索引失效和全表扫描。建议养成良好的SQL编程习惯,确保查询条件与列类型匹配,避免隐式转换以提高查询性能。

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

MySQL隐式转换还有这问题?

结论

当操作符 左右两边的数据类型 不一致时,会发生隐式转换。
当 where 查询操作符 左边为数值类型 时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。
当 where 查询操作符 左边为字符类型 时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。

字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。

所以,最好的解决方案就是我们一定要养成良好的SQL习惯,where条件的列是什么类型我们就应该传递什么类型,尽量不让MySQL来做隐式转换,就如同上述的情况一,由于隐式转换导致了MySQL不会走索引,导致索引失效触发全表扫描的问题。

串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。

所以,最好的解决方案就是我们一定要养成良好的SQL习惯,where条件的列是什么类型我们就应该传递什么类型,尽量不让MySQL来做隐式转换,就如同上述的情况一,由于隐式转换导致了MySQL不会走索引,导致索引失效触发全表扫描的问题。

mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | YES  |     | NULL    |                |
| code  | int         | YES  |     | NULL    |                |
| sex   | tinyint(1)  | NO   |     | 1       |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert into student value(0,3,110001,1);
Query OK, 1 row affected (0.00 sec)

mysql> select *  from  student;
+----+-----------+------------+-----+
| id | name      | code       | sex |
+----+-----------+------------+-----+
|  1 | 张三丰    |   20181601 |   1 |
|  2 | 尔四      |   20181602 |   1 |
|  3 | 小红      |   20181603 |   1 |
|  4 | 小明      |   20181604 |   1 |
|  5 | 小青      |   20181605 |   1 |
|  6 | 小明      |   20191302 |   1 |
|  7 | 22        | 2138291723 |   1 |
|  8 | 李明      |     654368 |   2 |
| 10 | 3         |     110001 |   1 |
+----+-----------+------------+-----+
9 rows in set (0.00 sec)

mysql> select * from student where name="3";
+----+------+--------+-----+
| id | name | code   | sex |
+----+------+--------+-----+
| 10 | 3    | 110001 |   1 |
+----+------+--------+-----+
1 row in set (0.00 sec)

mysql> select * from student where name=3;
+----+------+--------+-----+
| id | name | code   | sex |
+----+------+--------+-----+
| 10 | 3    | 110001 |   1 |
+----+------+--------+-----+
1 row in set, 7 warnings (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值