前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数字和字符串的比较

MySQL数字和字符串的比较

作者头像
CBeann
发布2023-12-25 18:47:31
1400
发布2023-12-25 18:47:31
举报
文章被收录于专栏:CBeann的博客CBeann的博客

问题的引出

实验

创建表

mysql版本 5.6.48

代码语言:javascript
复制
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,此时执行

代码语言:javascript
复制
//正确的代码
UPDATE test set name = "55" where name = "5"

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

代码语言:javascript
复制
//错误的代码
UPDATE test set name = "55 where name" = "5"

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

执行这条SQL

代码语言:javascript
复制
UPDATE test set name = "55 where name" = "5"

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

现在有2个问题。

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

代码语言:javascript
复制
UPDATE test set name = "55 where name" = "5"

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

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

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

代码语言:javascript
复制
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中字符串与数字比较的坑 - 活在夢裡 - 博客园

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题的引出
  • 实验
    • 创建表
      • 引出问题
        • 分析问题:为什么上面错误的代码会把所有的都变为0?
          • 拓展问题:数字和字符串的比较
          • 参考
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档