【问题标题】:Can't send the value of null to MySQL database using Node.JS无法使用 Node.JS 将 null 的值发送到 MySQL 数据库
【发布时间】:2017-09-07 22:04:55
【问题描述】:

我正在尝试使用 Node.JS 将 null 发送到我的 MySQL 数据库:

con.query("INSERT INTO Routes (routeTrigger) VALUES ( " + null + " )", {title: 'test'}, function(err, result) {
    if (err) throw err;
});

但在查看数据库时,更新后的值显示为'null'。数据库的NULL 应该是NULL。如果我改为发送资本NULL,那甚至不起作用(在 Node.JS 中)。如果我发送'NULL',它会发送字符串“NULL”,而不是数据库的NULL

【问题讨论】:

  • 请永远不要使用字符串连接来构建您的查询。这只是一个坏习惯,会在您制作产品时让您面临 SQL 注入黑客攻击。

标签: javascript mysql node.js null


【解决方案1】:

JavaScript 的 null 与 SQL 的 Null 不同。您想要(在您的情况下,使用原始 SQL 字符串)一个字符串:

con.query("INSERT INTO Routes (routeTrigger) VALUES ( null )", {title: 'test'}, function(err, result) {
    if (err) throw err;
});

但请注意,这会创建一个完全是 null 的行。这是可能的,但不太可能是您想要的。

你实际上想做什么?

【讨论】:

  • 感谢您的回复,但很遗憾,帮助不大。请参阅我对下面答案的评论,我想我想要的内容会更清楚。
【解决方案2】:

如果你想在SQL表中赋值NULL值,你可以换个思路。

您可以调整字段(列)而不是分配 NULL,以便 默认值(未分配值时)为:NULL强>。

现在,当您插入新行时,只需不要为该字段分配任何值


例子:

假设表格的结构如下:

我的表

id:自动递增; ...

名称:文字

网址:文字;默认 = NULL

那么你可以这样做:

INSERT INTO Mytable ( name ) VALUES ( "Joe" );

当您省略 url 信息时,它会被设置为 NULL

【讨论】:

  • 感谢您的回复。我意识到这一点。但事情的真相是,查询有时会有或多或少的数据要发送(并因此分配)。因此,我必须确保查询处理所有最终变量,因为它们来自用户输入。
  • 是的,我明白了,也许您可​​以将问题的标题更改为something like this。但是您知道,通常是您这边(在代码中)的一个简单错误导致了这个问题。尝试console.log( query ) 看看您的查询是什么样的。
【解决方案3】:

要使用 nodejs 在 mysql 中传递 null 值,我们需要一种不同的查询实现。

conn.query({
    sql: `INSERT INTO project values(?, ?, ?, ?);`,
    values: [projectId, name, startDate, endDate]}, (error, results) => {
        if (error) {
            console.log("Error executing sql: ", error.message);
            return res.send(error);
        }
    });
});

官网说:“undefined/null都转换为NULL” 并且有效。

使用上述语法触发查询。

【讨论】:

    【解决方案4】:

    使用节点mysql package,我可以通过执行以下操作插入空值:

    let myValue = null;
    

    注意列配置:

    'myValue' varchar(15) DEFAULT NULL

    【讨论】:

      【解决方案5】:

      这用于使用 Node.js 从 JSON 迁移 PostgresQL 表;可能会有所帮助。检查来自您的源的值,如果该列不存在,请使用带双引号的“NULL”。例如,如果是 JSON:

      const makeVal = (val) => {
          if (val === undefined) {
              return "NULL"
          } else {
              return "'" + JSON.stringify(val).replace(/'/g, "''") + "'" 
          }
      }
      

      请参阅此要点https://gist.github.com/foureyedraven/ca90a7dcbfd0918c153b0c91ec9317c5 以了解完整实施。

      【讨论】:

        【解决方案6】:

        成功了

        if (my_var != null) {
            my_var = '"' + my_var + '"';
        }                             
        else {
            my_var = "NULL";
        }
        connection.query('insert into my_table(my_var) values(' + my_var + ')', (error, results) => {
            if (error) {
                throw error;
            }
            connection.end();
        });
        

        【讨论】:

        • 这根本不是 SQL 注入证明。不要听从这家伙的建议!
        • 该代码对我有用,您能解释一下为什么这不是 sql 注入吗?
        • 该代码完全可以正常工作,但破解您的数据库也可以使用该代码。
        猜你喜欢
        • 2019-04-30
        • 2016-03-22
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-25
        相关资源
        最近更新 更多