Error 1390 (HY000): Prepared statement contains too many placeholders
开发找过来说mysql库执行insert 语句时报下面这个错,我也是第一次遇到,于是一顿研究之后,终于找到了原因
code: 100500003, msg: DB 异常
Error 1390 (HY000): Prepared statement contains too many placeholders
先来看看什么是Prepared statement
Prepared Statement(预编译语句) 是 MySQL 提供的一种 SQL 执行机制,其核心特点是:
预编译:SQL 语句模板先被编译,参数位置用占位符(如 ?)表示。
参数化执行:编译后的语句可多次执行,每次只需传入不同参数值。
优势:
性能提升:避免重复编译 SQL,尤其适合批量执行。
SQL 注入防御:参数值自动转义,防止恶意注入。
类型安全:参数类型由数据库自动处理,减少类型转换错误。
Prepared Statement 工作流程
1、准备阶段(Prepare),发送带占位符的 SQL 模板到数据库编译:
PREPARE stmt FROM 'SELECT * FROM users WHERE id = ? AND name = ?';
2、绑定参数(Bind),通过 SET 语句为占位符赋值:
SET @id = 1;
SET @name = 'Alice';
3、执行语句(Execute),传入参数执行预编译语句:
EXECUTE stmt USING @id, @name;
4、释放资源(Deallocate),执行完毕后释放预编译语句:
DEALLOCATE PREPARE stmt;
报这个错的原因
报错场景:批量插入数据、查询数据的条件过多、in 语句里数据过多
根本原因:执行的SQL语句中包含了过多的占位符,MySQL对SQL语句中的占位符数量是有限制的(常见限制是65536个占位符)。
批量插入更新时:写入数据为m列,n行时,必须保证 m*n < 65536
查询数据时:必须保证 查询条件的占位符 ?< 65536
所以解决这个问题的办法就是减少占位符,即需要分批处理数据,每一批的数据占位符不要超过限制即可。

浙公网安备 33010602011771号