0
点赞
收藏
分享

微信扫一扫

MySQL数字和字符串的比较


问题的引出

​​同事写了一个update,误用一个双引号,生产数据全变0了!​​

实验

创建表

mysql版本 5.6.48

CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1111111116 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', '1');
INSERT INTO `test` VALUES ('2', '2');
INSERT INTO `test` VALUES ('3', '3');
INSERT INTO `test` VALUES ('4', '4');
INSERT INTO `test` VALUES ('5', '5');

引出问题

我想把name=5的设置为55,此时执行

//正确的代码
UPDATE test set name = "55" where name = "5"

但是如果执行了下面错误的代码,则后果很严重

//错误的代码
UPDATE test set name = "55 where name" = "5"

MySQL数字和字符串的比较_数据

分析问题:为什么上面错误的代码会把所有的都变为0?

执行这条SQL

UPDATE test set name = "55 where name" = "5"

现在的SQL简化为update tableName set colName = "xxx" = "yyy"

现在有2个问题。

问题1:为什么修改的是全表?

UPDATE test set name = "55 where name" = "5"

请问上面的SQL中有where关键字吗?没有 ,就像 update tableName set name = "where 1=1"  ,没有where,所有就是全表

问题2:为什么修改为0,而不是其他数?(☆)

其实这个SQL的的执行逻辑是

UPDATE test set name = ("55 where name" = "5")

这就很清晰了,"5 where name" = "5"   的值为 0

拓展问题:数字和字符串的比较

select '5 where name' = 5;   //1

select '55 where name' = 5;  //0

对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分;对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了

select cast('123abc' as signed); //123

select cast('abc' as signed); //0

参考

​​同事写了一个update,误用一个双引号,生产数据全变0了!​​

​​MySQL中字符串与数字比较的坑 - 活在夢裡 - ​​

举报

相关推荐

0 条评论