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函数一样的高级排名 ...
随机推荐
- 3、pytorch实现最基础的MLP网络
%matplotlib inline import numpy as np import torch from torch import nn import matplotlib.pyplot as ...
- sklearn决策树应用及可视化
from sklearn import datasets from sklearn.tree import DecisionTreeClassifier 1.载入iris数据集(from sklear ...
- sqli-labs less13-20(各种post型头部注入)
less-13 POST型双查询注入 less-14 POST型双查询注入 less-15 POST型布尔注入 less-16 POST型布尔注入 less-17 POST型报错注入(updatexm ...
- sqlplus、lsnrctl命令工具不可用(libclntsh.so.11.1)
原因: libclntsh.so.11.1文件丢失了 解决方法: 在其他机器把这个文件拷贝到目标库安装目录底下的lib目录即可
- mysql难题收录
1.计算相邻两行的年龄的差距 表中的数据如下 select (s.age-(select age from stu where id - s.id = 1)) from stu as s; selec ...
- 记一次HBase的NotServingRegionException问题
1. 问题 在hbase测试集群上,访问一些hbase表,均报类似下面的错误:region不可用 Wed Oct 28 14:00:56 CST 2020, RpcRetryingCaller{glo ...
- Python制作塔防小游戏
开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块.
- JDK、JRE、JVM,是什么关系?
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- 【整理】互联网服务端技术体系:高性能之并发(Java)
分而合之,并行不悖. 综述入口见:"互联网应用服务端的常用技术思想与机制纲要" 引子 并发,就是在同一时间段内有多个任务同时进行着.这些任务或者互不影响互不干扰,或者共同协作来完成 ...
- CentOS7 实战源码部署nginx网站服务器
简介:实战演练nginx网站服务器的搭建 nginx 简介: Nginx是一款高性能的 HTTP 和反向代理服务器 Nginx的优点: 1.高并发量:根据官方给出的数据,能够支持高达 50,000 ...