MySQL数字和字符串的比较 | 您所在的位置:网站首页 › null和数字能比较吗 › 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"执行这条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中字符串与数字比较的坑 - 活在夢裡 - 博客园 |
CopyRight 2018-2019 实验室设备网 版权所有 |