MySQL数字和字符串的比较 您所在的位置:网站首页 null和数字能比较吗 MySQL数字和字符串的比较

MySQL数字和字符串的比较

2024-07-12 23:15| 来源: 网络整理| 查看: 265

问题的引出

同事写了一个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中字符串与数字比较的坑 - 活在夢裡 - 博客园



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有