MySQL中in('5,6,7')只取第一个id为5对应的数据的思考
通过阅读本文你可以更好的理解两个知识点:
1.#{}与${}在实际项目中的使用,避免在项目中使用不当造成不可预知的Bug;
2.MySQL中in里面如果是字符串的话,为什么只取第一个对应的数据,eg: in (“5,6,7”);
------------------------------------------------------------------------------------------------------------
快过年了,项目决定年后上线,在修Bug阶段,在Bug解决后开始当水手划水了,然后复习了下MyBatis的动态SQL的知识,无意中看到一个大佬写的代码,发现和我们平常写的方式有点不同,觉得这样写会产生问题,于是乎开启了思考。正常情况下,我们在用in的时候,参数都用List或者一个Vo对象(里面有一个List),然后用foreach的方式循环取值,但是这个大佬居然in里面是String类型的参数,这样写能查出值吗?
通常的写法:


注:stockInBands是vo对象中的一个List类型的属性。
质疑大佬的写法:

这个String类型的orgIds取值过程如下:

使用了StringUtils.join()的方法将List转为逗号隔开的String类型,我开始了思考,这样的话最后这个String不是变成了类似(“5,6,7”)这样的格式吗?MySQL中in(“5,6,7”)这样的格式可以查出来吗?然后我就开始在数据库中写SQL语句尝试,发现了一个奇怪的现象,这样的格式可以查出来,但是永远只能查出第一条数据,在例子中就是id为5对应的数据,后面的6,7为啥查不出来?
表数据如下:

发现这五条SQL都能查出数据,但是前三条SQL能查出3条数据,而后两条SQL都只能查询出id为5对应的数据。


我开始百度查阅相关知识点,发现在MySQL中in里面如果是字符串的话,会自动使用类似CAST('5,6,7' AS INT)方法转化成int类型,对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分(本例中第一个逗号前的数据),对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了,如下图实例。

这个疑惑解决后,我想了下难道这个大佬写的真有问题,只是他和测试没发现问题吗?我又仔细看了下代码后发现这个大佬写的SQL里面用的是$而不是#,难道用$就能查询正常吗?然后我开始复习#{}与${}的区别,发现果然如此,这个大佬因为用的是$,${} 解析之后是什么就是什么,他不会当做字符串处理。假设传入参数是”Smith”会解析成:order by Smith或者in (Smith),所以并没有出现我发现的那种只会查出第一个id为5对应数据的问题。原来只是因为自己知识浅薄,造成的误解。
如过您想深入了解#{}与${}的相关知识,请查阅我博客中java基础分类中的--#{}和${}的区别是什么? 一文,谢谢。
MySQL中in('5,6,7')只取第一个id为5对应的数据的思考的更多相关文章
- 转:深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...
- 深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...
- mysql中删除重复记录,只保留一条
表结构如下: mysql> desc test1; +--------------+------------------+------+-----+---------+------------- ...
- mysql中的多行查询结果合并成一个
SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 ...
- 写一个python 爬虫爬取百度电影并存入mysql中
目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...
- MySql 中游标,事务,终止存储过程方法总结
最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到 ...
- MySQL学习笔记:floor、round —— 取整
在MySQL中做数值处理,需要取整或者四舍五入. floor:函数只返回整数部分,小数部分舍弃: round:函数四舍五入: END 2018-05-29 11:31:22
- 在MySQL中实现Rank高级排名函数【转】
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- 在MySQL中实现Rank高级排名函数
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
随机推荐
- 关于utf-8编码值 [ASIS 2019]Unicorn shop
0x00 前言 这题拿到之后有点懵,后来看了 网上的 wp 更加懵,网上大多数都是直接说 去 compart 搜thousand,然后找个大于1337 的就可以,至于为什么?基本都没有给出解答.于是乎 ...
- XSS挑战赛(1)
以前囫囵吞枣做过一遍,现在从头再来 第一关网址为:http://127.0.0.1/xss-labs-master/level1.php?name=test 而页面上显示了用户test,name可控, ...
- PC微信[多开+免扫码+防撤回撤回提示+转存语音+自动收款+远程命令]
PC端微信玩出了新花样,主要技术为Hook技术 有兴趣的小伙伴可以去了解下hook钩子技术 版本介绍: 增加转存语音到MP3(保存你重要的语音数据) 增加表图转存; 增加自动收转账和自动回复; 增加远 ...
- vue props默认值国际化报错
未做国际化处理 tabLabel: { type: Array, default: () => (["a", "b", "c"]) } ...
- centos7.5以上poenssl和openssh升级
2020年12月09日,360CERT监测发现 openssl 发布了 openssl 拒绝服务漏洞 的风险通告,该漏洞编号为 CVE-2020-1971 ,漏洞等级:高危 ,漏洞评分:7 ...
- 数位DP复习笔记
前言 复习笔记第五篇.(由于某些原因(见下),放到了第六篇后面更新)CSP-S RP++. luogu 的难度评级完全不对,所以换了顺序,换了别的题目.有点乱,见谅.要骂就骂洛谷吧,原因在T2处 由于 ...
- 【题解】「UVA10116」Robot Motion
Simple Translation 让你模拟一个机器人行走的过程,如果机器人走入了一个循环,输出不是循环的长度和是循环的长度,如果最终走出来了,输出走的步数. Solution 直接模拟即可,本题难 ...
- AcWing 332. 股票交易
大型补档计划 题目链接 \(f[i][j]\) 表示前 \(i\) 天,手里有 \(j\) 个股票挣得最多钱 买股票.枚举 \(u < i - W\) \(f[i][j] = max(f[u][ ...
- HDFS 操作命令
本地文件系统创建一个文件,输入带姓名学号信息. 查看新建文件所在目录 查看新建文件内容 将此文件上传到HDFS文件系统上的用户目录 HDFS上查看相应目录 HDFS上查看文件内容 HDFS上查看文件大 ...
- MyBatis详细源码解析(上篇)
前言 我会一步一步带你剖析MyBatis这个经典的半ORM框架的源码! 我是使用Spring Boot + MyBatis的方式进行测试,但并未进行整合,还是使用最原始的方式. 项目结构 导入依赖: ...