:::info
环境:mysql8.0.36
系统:unbuntu 20.4
:::
将本地的node项目部署到unbuntu服务器上后遇到了该问题,查阅资料得知是mysql2这个包在特定mysql版本下的bug。引用一段ai的话
这个错误通常出现在 MySQL 8.0.22 及其之后的版本中1。当查询中使用了 LIMIT ? 时,就会出现 “Incorrect arguments to mysqld_stmt_execute” 错误。目前,这个问题的解决方案是将参数的值映射为字符串
现在我们有两个方案:
- 降低mysql的版本,对于不熟悉后端的前端同学(比如我),将会面临很多的风险。
- 将参数从数字改为字符串。一个个改动会造成开发和部署行为不一致,影响开发体验,绝对是不能接受的。
所幸的是,对于替换字符串的方法,我们有更优雅的解决方案。
import mysql from 'mysql2/promise'
let db = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'admin123',
database: 'my_db_02',
})
export const db_execute = (sql, params) => {
if (!params) {
return db.execute(sql, params)
} else {
const new_params = params.map(item => {
if (typeof item === 'number') {
return item.toString()
}
return item
})
return db.execute(sql, new_params)
}
}
export db
通过一个包装,就可以避免错误。这里没有银弹。