dushaoshuai / dushaoshuai.github.io

https://www.shuai.host
0 stars 0 forks source link

MySQL: Error 1390 (HY000): Prepared statement contains too many placeholders #146

Open dushaoshuai opened 2 months ago

dushaoshuai commented 2 months ago

问题

数据库版本为 MySQL 5.7,使用 gorm 的 Create() 方法向其中批量插入数据,报错 Error 1390 (HY000): Prepared statement contains too many placeholders。

解决方法,指定批量插入的大小

预处理语句

预处理语句(Prepared Statements)是一种数据库查询优化技术, MySQL 5.7 和 MySQL 8.0 都提供了服务器端预处理语句的支持。在服务器端预先解析并保存 SQL 语句,有以下好处:

  1. 每次执行语句时解析语句的开销更少,因为已经预先解析过了。
  2. 防止 SQL 注入攻击。

语法

在这个官网的例子中:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
  1. PREPARE 解析(预处理)SQL 语句,并将其命名为 stmt1。在 SQL 语句中,? 字符是实际数据的占位符,指示执行语句时实际数据要被绑定到的位置。
  2. EXECUTE 执行预处理语句。在这一步,实际数据才被传递给数据库。
    • SQL 语句和数据是分开处理的。用户数据不会被当作 SQL 代码,防止了SQL 注入攻击。
    • 用户数据可以包含特殊字符,因为数据库会自动进行适当的转义处理。
  3. DEALLOCATE PREPARE 删除预处理语句。

和 session 的关系

See also