SQL WHERE IN参数化编译写法简单示例
前言
最近在一次使用sql中的where in语句时,造成了一些非预期的查询结果。尤其是在代码中去编写并执行sql语句时,会出现一些意外情况。再查阅了一些资料以及手动测试后,发现是自己sql语句写法存在问题,在此记录。
例子
业务需求,需要通过SQL语句从asset资产表中查询域名字段在(“thief.one”,”nmask.cn”,”sec.thief.one”)范围内的数据库记录,SQL语句该怎么写呢?
拼接法(错误)
values = "'thief.one','nmask.cn','sec.thief.one'" sql = "select * from asset where domain in ("+values+")" print sql
说明:通过将搜索条件以字符串拼接的方式构造sql语句,语法上可通过,但存在着安全隐患(参照sql注入漏洞)
参数化1(错误)
values = (("thief.one","nmask.cn","sec.thief.one"),) sql = "select * from asset where domain in %s" print sql print values
说明:通过参数化方式,将where in 后面的查询内容传入。表面上看没问题,但在编译过程中,会将(“thief.one”,”nmask.cn”,”sec.thief.one”)整体看成一个字符串,而作为查询条件,与需求不符合。
参数化2(正确)
values = ("thief.one","nmask.cn","sec.thief.one") sql = "select * from asset where domain in ({})".format(",".join(['%s' for i in values])) print sql print values
说明:通过计算values里面字符串个数,动态构造编译的参数。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
相关推荐
-
解析sql语句中left_join、inner_join中的on与where的区别
table a(id, type):id type ----------------------------------1 1 2 1 3 2 table b(id, class):id class ---------------------------------1 12 2sql语句1:select a.*, b.* from a left join b on a.id = b
-
MySQL的WHERE语句中BETWEEN与IN的使用教程
MySQL BETWEEN 用法 MySQL BETWEEN 语法 BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围.BETWEEN 同 AND 一起搭配使用,语法如下: WHERE column BETWEEN value1 AND value2 WHERE column NOT BETWEEN value1 AND value2 通常 value1 应该小于 value2.当 BETWEEN 前面加上 NOT 运算符时,表示与 BETWEEN 相反的意思,即选取
-
MySQL 存储过程传参数实现where id in(1,2,3,...)示例
正常写法: 复制代码 代码如下: select * from table_name t where t.field1 in (1,2,3,4,...); 当在写存储过程in里面的列表用个传入参数代入的时候,就需要用到如下方式: 主要用到find_in_set函数 复制代码 代码如下: select * from table_name t where find_in_set(t.field1,'1,2,3,4'); 当然还可以比较笨实的方法,就是组装字符串,然后执行: 复制代码 代码如下: DRO
-
SQL WHERE IN参数化编译写法简单示例
前言 最近在一次使用sql中的where in语句时,造成了一些非预期的查询结果.尤其是在代码中去编写并执行sql语句时,会出现一些意外情况.再查阅了一些资料以及手动测试后,发现是自己sql语句写法存在问题,在此记录. 例子 业务需求,需要通过SQL语句从asset资产表中查询域名字段在("thief.one","nmask.cn","sec.thief.one")范围内的数据库记录,SQL语句该怎么写呢? 拼接法(错误) values = &q
-
android开发实践之ndk编译命令简单示例
前言 Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java工程/Android手机可以识别.加载和运行的库或者应用程序. 默认情况下,使用NDK编译c/c++代码,需要将该代码放置到任一个Android应用工程的jni目录下,然后编写相应的Android.mk文件,并执行ndk-build命令完成编译.其实你也是可以在任意目录下去编译native代码
-
Java及Android中常用链式调用写法简单示例
本文实例讲述了Java及Android中常用链式调用写法.分享给大家供大家参考,具体如下: 最近发现,目前大火的许多开源框架中,大多都使用了一种"(方法).(方法).(方法)"的形式进行调用,最典型的就是RxJava.android中AlertDialog控件的源码也是这种形式的.查阅可知,大家把它叫做链式调用."行动是检验程序的唯一标准"0.0!查了.说了那么多,还是得自己写个例子并运行出预期的效果. /** * * 链式调用 * * @author k.k *
-
thinkPHP5框架接口写法简单示例
本文实例讲述了thinkPHP5框架接口写法.分享给大家供大家参考,具体如下: 控制器 /** * 添加收货地址 */ public function addAddress(){ $post = $this->request->post(); //验证 唯一规则: 表名,字段名,排除主键值,主键名 $validate = new \think\Validate([ ['uid', 'require', '用户id不能为空'], ['name', 'require|max:20', '收件人不能
-
SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法
parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的SQL(或者存储过程中使用了参数化)写法,如果存在数据分布不均匀的情况下,正常情况下生成的执行计划,在传入在分布数据较多的参数的情况下,重用了正常参数生成的执行计划,而这种缓存的执行计划并非适合当前参数的一种情况. 这种情况,在实际业务中,出现的频率还是比较高的,因为存储过程一般都是采用参数化的写法
-
SQL注入原理与解决方法代码示例
一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击
-
Java通用Mapper UUID简单示例
#通用 Mapper UUID 简单示例 ##不可回写的 UUID 通用 Mapper 中对 UUID 的用法主要提到了一种专有的写法,如下写法: @GeneratedValue(generator = "UUID") 这种方式实现很容易理解,就是在你 insert 之前,调用 UUID 的公共方法在<bind> 标签中生成了一个值,插入到了数据库,由于这个值是临时的,并没有set到对象,因此这种方式是不支持回写的. 由于回写方式很常见,因此用这种方式很难满足要求. 而且在
-
C++程序简单示例
目录 1.注释 2.include 3.main函数 4.命名空间 5.cout 前言: 很多小伙伴反应想要用C++刷LeetCode,但是对于C++语法不熟悉,对于很多算法和数据结构也不够了解.这就导致了刷题的时候需要四处查询资料,非常的麻烦. 我们先来看一段C++的示例代码: // my first cpp file #include <iostream> int main() { using namespace std; cout << "hellworld&quo
-
sql分页查询几种写法
关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTest use DBTest --创建测试表 create table pagetest ( id int identity(1,1) not null, col01 int null, col02 nvarchar(50) null, col03 datetime null ) --1万记录集 declar
-
jquery easyui DataGrid简单示例
一.简单示例 HTML <table id="tbList" striped="true" rownumbers="true" fix="true" fitcolumns="true" title="标题" idfield="ID" checkbox="true" url="@Url.Action("ListData&qu
随机推荐
- PHP实现发送邮件的方法(基于简单邮件发送类)
- ASP页面静态化批量生成代码分享(多种方法)
- ASP.NET页面缓存常见的4种方式
- CentOS系统中一键安装Openstack图文教程
- 解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
- javascript对象的创建和访问
- jQuery Ajax传值到Servlet出现乱码问题的解决方法
- Python中index()和seek()的用法(详解)
- js 判断登录界面的账号密码是否为空
- js 字符串转化成数字的代码
- js动态创建标签示例代码
- 微信小程序 火车票查询实例讲解
- 实例讲解String Date Calendar之间的转换
- Java里volatile关键字是什么意思
- Python之父谈Python的未来形式
- 生成sessionid和随机密码的例子
- PHP4中实现动态代理
- Android开发中Activity之间切换出现短暂黑屏的解决方法
- python matplotlib坐标轴设置的方法
- Python简单实现查找一个字符串中最长不重复子串的方法