【发布时间】:2021-11-07 06:04:42
【问题描述】:
我将 Node 与 mysql 包一起使用。
首先我建立一个连接:
require('dotenv').config()
var mysql = require('mysql');
var connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
collation: "utf8mb4_unicode_ci"
});
connection.connect();
然后我尝试使用查询占位符在日志表中插入一行:
var query = connection.query("INSERT INTO logs SET ?", {ip: "127.0.0.1", request: "TEST"}, (error, results, fields) => {
if (error) throw error;
});
完全如文档中所述:
var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function (error, results, fields) {
if (error) throw error;
// Neat!
});
https://github.com/mysqljs/mysql#escaping-query-values
尽管生成的查询看起来是正确的:
INSERT INTO logs SET `ip` = '127.0.0.1', `request` = 'TEST'
我收到以下错误:
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO logs SET `ip` = '127.0.0.1', `request` = 'TEST'' at line 1
qi-node | at Query.Sequence._packetToError (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
qi-node | at Query.ErrorPacket (/app/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
qi-node | at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
qi-node | at Parser._parsePacket (/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
qi-node | at Parser.write (/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
qi-node | at Protocol.write (/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
qi-node | at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:88:28)
qi-node | at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:526:10)
qi-node | at Socket.emit (events.js:400:28)
qi-node | at addChunk (internal/streams/readable.js:290:12)
qi-node | --------------------
qi-node | at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
qi-node | at Connection.query (/app/node_modules/mysql/lib/Connection.js:198:25)
qi-node | at Object.<anonymous> (/app/database.js:14:24)
qi-node | at Module._compile (internal/modules/cjs/loader.js:1072:14)
qi-node | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
qi-node | at Module.load (internal/modules/cjs/loader.js:937:32)
qi-node | at Function.Module._load (internal/modules/cjs/loader.js:778:12)
qi-node | at Module.require (internal/modules/cjs/loader.js:961:19)
qi-node | at require (internal/modules/cjs/helpers.js:92:18)
qi-node | at Object.<anonymous> (/app/server.js:4:16)
但是,当我在没有动态占位符的情况下执行完全相同的查询时,查询会按预期工作并成功插入行。
var query = connection.query("INSERT INTO logs SET `ip` = '127.0.0.1', `request` = 'TEST'", (error, results, fields) => {
if (error) throw error;
});
我尝试更改数据库排序规则,并确保 NO_BACKSLASH_ESCAPES 模式已禁用。仅供参考:整个设置在 docker 容器中运行。
我想不出这不起作用的任何原因。可能是什么错误?
【问题讨论】: