【问题标题】:Using dots in a MySQL database - updating using node在 MySQL 数据库中使用点 - 使用节点更新
【发布时间】:2016-05-08 23:14:41
【问题描述】:

我正在尝试使用 node-mysql 更新包含节点中一个点的列名。我喜欢你如何通过只给它一个带有键的对象来轻松更新多个列,但是 node-mysql 对字符串的转义在这里失败了。

这是我的代码:

socket.on('settings',function(data){
    console.log(data);
    database.query('UPDATE Settings SET ? WHERE ?',[data,{name:socket.name}],function(err,rows){
        if(err) console.log(err);
    });
});

当这个事件以 data = {'a.b':'hello'} 触发时,它给了我以下错误:

{ [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
''`a`.`b` = 'hello'' WHERE `name` = 'somename'' at line 1]

我知道不在列名中使用点可以解决我的问题,但我真的希望它们存在。

编辑:似乎使用“ab”作为列名会给我 ER_BAD_FIELD_ERROR,与“abc”相同,即使它们在表中,但当我使用“abcd”时它说 ER_PARSE_ERROR。我很混乱。我不会在列名中使用点,但我仍然想知道为什么它会产生不同数量的点的不同错误。

【问题讨论】:

  • 如果你试图用 \\ 来转义点怎么办。
  • 好的。我缩小了我的问题。它找到列名(如果我用不在表中的列名测试它,我会收到 UNKNOWN_COLUMN_NAME 错误。这里我收到 ER_PARSE_ERROR 错误,这意味着我的查询有问题。我会再看一下.
  • 我编辑了我原来的问题。

标签: javascript mysql node.js


【解决方案1】:

错误信息中的注释:

`a`.`b`

表示“current_database”(如果 a 不是数据库名称)->“名称为 'a' 的表”->“名称为 'b' 的列”。因此,如果要在列名中使用点,则应使用反引号将其全部括起来:

UPDATE table_name.`a.b` = 'hello' WHERE `name` = 'somename';

顺便说一句,我更喜欢使用双下划线而不是点 (a__b) 来避免使用 backtiks,想想吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2018-01-29
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多