【问题标题】:NodeJS - use of MySql query placeholder results in 1064 ER_PARSE_ERRORNodeJS - 使用 MySql 查询占位符导致 1064 ER_PARSE_ERROR
【发布时间】:2021-11-07 06:04:42
【问题描述】:

我将 Nodemysql 包一起使用。

首先我建立一个连接:

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 容器中运行。

我想不出这不起作用的任何原因。可能是什么错误?

【问题讨论】:

    标签: mysql node.js docker


    【解决方案1】:

    我设法弄明白了。它与 MySql 或 NodeJs 无关。相反,一个 bad space character 不知何故溜进了语句,导致它无缘无故地失败。然后我继续复制。

    如果你有兴趣可以阅读这篇文章:https://en.wikipedia.org/wiki/Non-breaking_space

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2018-01-02
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2016-02-14
      相关资源
      最近更新 更多