实验
创建表
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