MySQL数字和字符串的比较

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 问题的引出同事写了一个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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
SQL 存储 关系型数据库
|
19天前
|
关系型数据库 MySQL 数据库
MySQL数据库-截取字符串
MySQL数据库-截取字符串
32 0
|
19天前
|
关系型数据库 MySQL 数据库
MySQL数据库-字符串位数不够前面补0
MySQL数据库-字符串位数不够前面补0
42 0
|
19天前
|
SQL Oracle 关系型数据库
MySQL之如何将字符串分隔为列表结果集
MySQL之如何将字符串分隔为列表结果集
121 1
|
7月前
|
关系型数据库 MySQL
MySQL清除字符串首尾空格函数
MySQL清除字符串首尾空格函数
|
9月前
|
存储 NoSQL 关系型数据库
7.4.4 【MySQL】索引字符串值的前缀
7.4.4 【MySQL】索引字符串值的前缀
45 0
|
19天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
6月前
|
存储 关系型数据库 MySQL
MySQL中的列类型之字符串类型总结
MySQL中的列类型之字符串类型总结
84 1
|
10月前
|
数据采集 关系型数据库 MySQL
切割字符串:深入了解MySQL中的SUBSTRING()函数
在数据库操作中,提取字符串的一部分是常见的需求,这时可以使用MySQL中的SUBSTRING()函数。本文将深入探讨SUBSTRING()函数的用法、示例以及在数据库操作中的应用。
255 0
|
19天前
|
SQL JSON 关系型数据库
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
66 0