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"

分析问题:为什么上面错误的代码会把所有的都变为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中字符串与数字比较的坑 - 活在夢裡 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CBeann

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值