【MYSQL】字符串拼接和参数化sql语句区别

总结:

参数化不是为了复用查询结果,

而是为了固定 SQL 结构,让解析和执行行为可预测;

同时通过语义隔离彻底消除 SQL 注入。

字符串拼接:

csharp 复制代码
var ids = string.Join(",", idList);

var sql = $@"
SELECT *
FROM a
WHERE a.id IN ({ids});
";
//生成sql可能是
SELECT *
FROM a
WHERE a.id IN (1,2,3,4,5,6,7,8,9,...);

参数化sql:

csharp 复制代码
var parameters = new List<MySqlParameter>();
var placeholders = new List<string>();

for (int i = 0; i < idList.Count; i++)
{
    var name = $"@id{i}";
    placeholders.Add(name);
    parameters.Add(new MySqlParameter(name, idList[i]));
}

var sql = $@"
SELECT *
FROM a
WHERE a.id IN ({string.Join(",", placeholders)});
";
//生成固态sql
SELECT *
FROM a
WHERE a.id IN (@id0,@id1,@id2,...);

在代码层面,虽然每次调用都是不同的sql,但是对于mysql数据库来说完全不一样。

上面给出的两个代码注释下面就是数据库接收到的sql模式,可以看到,参数化每次数据库接收的都是一样的。因此 参数化让数据库能够 复用 解析结构和执行计划,从而减少解析与优化的开销。 而拼接字符串每次都是不同的sql语句,需要重新解析。

另外拼接字符串会有注入的风险,但是参数化不会有。因为数据库在解析阶段只确认"占位符的位置和类型",并不会把参数值当成 SQL 语法来解析。

举个例子说明:

这是字符串拼接

csharp 复制代码
sql = "WHERE id IN (" + userInput + ")";
//如果用户输入
1) OR 1=1 --
//最终sql是
WHERE id IN (1) OR 1=1 --)

参数化

csharp 复制代码
WHERE id IN (?)
//输入
1) OR 1=1 --
//数据库看到
id = "1) OR 1=1 --"

数据库处理流程是:

1.先解析 SQL 结构

2.确认:? 是一个"值占位符"

3.SQL 语法树已经固定

4.再把参数值"绑定"为数据

完结撒花~

相关推荐
小羊没烦恼!25 分钟前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路29 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源43 分钟前
springboot本地生活服务平台33399-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·小程序·flask·课程设计
码途行者1 小时前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
SelectDB1 小时前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
l1t1 小时前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
夜雪一千1 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
夜雪一千2 小时前
MySQL 如何存储经纬度坐标:选型、建表、空间查询实战
android·mysql·adb
CJi0NG2 小时前
【自用】MySQL-存储引擎
数据库·mysql
weixin_460443562 小时前
在线考试人脸识别如何合规?本地活体检测、人脸模板加密与替代认证的技术架构设计
大数据·数据库·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统