数据库执行语句时,严重注意类型转换的问题

  这次上线遇到一个bug,导致回滚。定位到问题,发现是sql执行时一个语句坑了。

简单说下,就以update语句为例。

创建一个表:

CREATE TABLE `test_01` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘auto incr id‘,
  `a_id` varchar(50) NOT NULL DEFAULT ‘ ‘ COMMENT ‘aid‘,
  `a_name` varchar(50) NOT NULL DEFAULT ‘ ‘ COMMENT ‘aname‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT=‘test表‘

插入几条数据:

insert into test_01(a_id,a_name) values(‘a1‘,‘n1‘),(‘a2‘,‘n2‘),(‘a3‘,‘n3‘);

ok,类型转换时的坑来了。

update test_01 set a_name=‘nn‘ where a_id=0;

更新的where条件是a_id=0,那么表里会发生更新么?

答案就是所有的行的a_name都更新为了‘nn‘。

为什么会发生这样的问题?因为表结构中设计的a_id是varchar类型,而更新语句中where条件的a_id是数字0。

这时就发生了类型转换的问题。mysql会把表里a_id列下所有行都转化为数字,去跟你告诉mysql的0进行比较。发现表里的a_id下转化为数字时,都转化成为了0。那么所有记录取出来就对了。

所以,在sql拼写时,一定要严格按照类型搞。

比如这个更新语句就应该写成:

update test_01 set a_name=‘nn‘ where a_id=‘0‘;// 加个引号
时间: 2024-12-15 20:20:59

数据库执行语句时,严重注意类型转换的问题的相关文章

拼接SQL执行语句时,对单引号的处理

例: declare @SQL nvarchar(1000); declare @str nvarchar(100); set @str='Joe''s NB'; // 打印出来的应该是这样:Joe's NB set @SQL='select * from table where t1=''' + @str + ''''; print(@SQL); // 打印SQL语句看看是否正确 exec (@SQL); ============================================

Ubuntu18.04系统执行语句时出现错误Failed to load module "canberra-gtk-module"

Ubuntu18.04系统执行gnuradio-companion时,命令行提示错误Failed to load module "canberra-gtk-module",虽然看起来不影响使用,但是总觉得别扭. 解决办法:命令行输入: sudo apt install libcanberra-gtk-module 原文地址:https://www.cnblogs.com/jsdy/p/11428925.html

pl/sql查看后台数据库执行语句

由于项目的原因,需要查看后台代码执行的查询语句以及检查其逻辑是否正确: 步骤:(1).首先在数据库里面刷新共享此 --刷新共享池alter system flush shared_pool; (2).在界面中操作你要查看后台直接的功能: (3).在PL/SQL数据库中执行以下语句: --查询用户最近执行的SQLselect sql_fulltext from v$sql where parsing_schema_name = '数据库名称' order by last_load_time;

mysql8.0数据库执行语句报1215-Cannot add foreign key constraint

原创公众号:路人甲Java     一位工作十年的前阿里P7大佬. 一.这个问题始终没整明白根本原因,只是换了个库再次执行可以成功. 1.在虚拟机中安装好linux系统后,想着装个mysql服务器吧,安装好之后就可以使用navicat进行连接操作了[具体搭建步骤后续更新]. 2.建好了也可以连接成功并创建了数据库,其他几张关联表也都执行成功,唯独在执行创建employees表的时候,界面报1215-Cannot add foreign key constraint,如下图: 3.经查阅资料,我做

按照首字母搜索功能(mysql数据库执行语句)

select *  from `dd` order by ELT(INTERVAL(CONV(HEX(left(CONVERT(num USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1

【ODP.NET 日期】 在使用Oracle ODP.NET执行Update时提示ORA-00932 和 ORA-01843

[问题] 底层数据库链接由Oracle.Client修改为ODP.NEt连接数据库,以提高执行效率. 执行语句时发现以下问题 cmd.CommandText = "update SYS_USER  set  LASTLOGIN=:LASTLOGIN, MOBILEPHONE='13000000000'  where USERID=:USERID11"; 首先提示 ORA-01843 无效月份,发现ODP.NET 使用OracleDbtype.Date时,Dbparameter.valu

sql sever数据库常用的执行语句

--使用master数据库use master --创建数据库文件create database 数据库名字 on( name=, --逻辑名称 filename= .ndf, --数据文件物理路径名称 size=, --文件初始大小 maxsize= , --文件最大的大小 filegrowth= --自动增长) --创建数据库日志文件log on( name=, --逻辑名称 filename= .ldf, --日志文件物理路径名称 size=, --文件初始大小 maxsize= , --

ORACLE数据库SQL语句的执行过程

首先是最简单链接数据库的过程,JDBC标准的链接的过程: 1. 载入JDBC驱动程序,一般来说载入驱动程序,采用的都是利用Class.forName()反射来加载驱动 Oracle: Class.forName("oracle.jdbc.driver.OracleDriver"); SQLServer: Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); MySql: Class.forNam

MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙