NodeJS使用mysql包查询占位符触发1064 ER_PARSE_ERROR语法错误
可能的故障点排查列表
- 确认实际发送的SQL内容和你预期的是否一致
你提到的生成SQL如果是自己模拟拼接的,建议打印query.sql的实际值甚至其十六进制编码,确认是否包含零宽空格、多余分号、换行残留等不可见字符。报错信息提示语法错误出现在INSERT语句开头,说明MySQL服务端接收到的内容在这条INSERT之前就存在异常字符,大概率是连接复用时上一条查询未发送完全的残留内容,或者SQL字符串本身夹带了不可见特殊符号。 - 检查npm依赖包和MySQL服务端的兼容性
如果Docker中部署的是MySQL 8.0及以上版本,而你使用的mysqlnpm包版本低于2.18.1,会存在协议适配、字符转义相关的兼容性问题。你可以执行npm list mysql查看当前使用的包版本,尝试升级到最新稳定版,或者改用适配性更好的mysql2包做验证。 - 排查数据库连接配置异常
检查创建连接的参数,确认是否误开了multipleStatements: true导致多条SQL被错误拼接提交,或者charset、timezone参数配置错误触发转义逻辑异常。另外确认你当前连接的数据库实例和你测试直连SQL的实例是同一个,避免Docker端口映射错误连到了其他库。 - 验证占位符传入对象是否正常
如果你用于占位符的对象是从接口、缓存等其他位置获取的,可能携带了不可枚举的隐藏属性或者Symbol类型属性,低版本mysql包处理这类属性时会生成异常的SQL片段。你可以手动构造纯对象传入测试,或者改用数组形式的占位符写法验证:
connection.query("INSERT INTO logs SET ip = ?, request = ?", ["127.0.0.1", "TEST"], (error, results, fields) => { if (error) throw error; });
内容的提问来源于stack exchange,提问作者DreiDe
相关产品推荐
相关产品推荐

