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)
评论 (0)