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函数一样的高级排名 ...
随机推荐
- Docker 基本概念(三)-生命周期详解(镜像、容器、仓库)
Docker三大组件:镜像.容器.仓库. 一.镜像 1 从仓库获取镜像 #一.从仓库获取镜像,帮助命令:docker pull -help 命令:docker pull [选项] [docker R ...
- ES6新特性之箭头函数与function的区别
写法不同 // function的写法 function fn(a, b){ return a+b; } // 箭头函数的写法 let foo = (a, b) =>{ return a + b ...
- kubernetes集群断电后etcd启动失败之etcd备份方案
一.问题描述 二进制部署的单Master节点的v1.13.10版本的集群,etcd部署的是3.3.10版本,部署在master节点上.在异常断电后,kubernetes集群无法正常启动.这里通过查看k ...
- 五、Zookeeper基于API操作Node节点
安装zookeeper :linux下安装Zookeeper 3.4.14 zookeeper 分为5个包: org.apache.zookeeper //客户端主要类文件 org.apache.zo ...
- libev的用法
本例是以linux环境c++的用法,ide用的是vs2019 一.libev的安装 我们采用的是apt-get方法(偷懒^_^),你也可以采用源码方式安装 sudo apt-get install l ...
- SseEmitter推送
后端代码SseController.java package com.theorydance.mywebsocket.server; import java.util.HashMap; import ...
- STL——容器(deque) 构造 & 头尾添加删除元素
1.deque容器概念 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,唯一不同的是:deque是双端数组,而vector是单端的. ...
- 关于大视频video播放的问题以及解决方案(m3u8的播放)
在HTML5里,提供了<video>标签,可以直接播放视频,video的使用很简单: <video width="320" height="240&qu ...
- 机器学习速查表(cheatsheet)资源汇总分享
本文收集整理了机器学习相关速查表(Machine Learning Cheatsheet),包含机器学习.Python.Numpy.Pandas.Matplotlib.线性代数.微积分.统计学.概率论 ...
- Raft算法系列教程1:Leader选举
1.服务器的三种角色 Raft算法中服务器主要分为三种角色:Leader.Follower.Candidate,并且三种角色相互独立,也就是服务器在同一时间内只可能扮演其中一种角色. Leader:用 ...