MySQL数字和字符串的比较

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 问题的引出同事写了一个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"


5.png


分析问题:为什么上面错误的代码会把所有的都变为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


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
SQL 存储 关系型数据库
|
8月前
|
SQL Oracle 关系型数据库
MySQL之如何将字符串分隔为列表结果集
MySQL之如何将字符串分隔为列表结果集
529 1
|
8月前
|
关系型数据库 MySQL 数据库
MySQL数据库-截取字符串
MySQL数据库-截取字符串
75 0
|
8月前
|
关系型数据库 MySQL 数据库
MySQL数据库-字符串位数不够前面补0
MySQL数据库-字符串位数不够前面补0
150 0
|
关系型数据库 MySQL
MySQL清除字符串首尾空格函数
MySQL清除字符串首尾空格函数
|
存储 NoSQL 关系型数据库
7.4.4 【MySQL】索引字符串值的前缀
7.4.4 【MySQL】索引字符串值的前缀
71 0
|
5月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
258 67
|
5月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第29天】MySQL的match匹配多个字符串的语法
169 2
|
4月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
233 0
|
5月前
|
存储 关系型数据库 MySQL