你如何正确地用 NULL 更新 mysql 字段?

Posted

技术标签:

【中文标题】你如何正确地用 NULL 更新 mysql 字段?【英文标题】:How do you properly update a mysql field with NULL? 【发布时间】:2011-12-21 16:21:37 【问题描述】:

在 sql 查询中使用变量时如何正确更新 mysql 字段为 NULL 值?

我有一个名为 $timestamp 的变量。当它设置为date( Y-m-d h:i:s ) 时,我必须将它用引号引起来,因为我在我的mysql 查询中传递了一个字符串。当 $timestamp 设置为 NULL 时,数据库查询包含 '' 作为 $timestamp 的值,并且字段更新为 0000-00-00 00:00:00。将此字段保持为 NULL 以表明该进程以前从未运行过,这一点很重要。

我不想使用 now(),因为那时我的 sql 语句与我的类变量 $timestamp 不同步。

我不想将 $timestamp 设置为 'NULL',因为那个变量不准确。它不再是 NULL,它被设置为一个包含单词 NULL 的字符串。

我在这里错过了什么?

【问题讨论】:

嗯,问题 #1 是您正在使用 SQL 字符串构建进行查询。不要那样做(没有真正好的理由......然后,不要那样做)。使用占位符(或任何不需要构建 SQL 字符串的 ORM/框架)。不仅这个问题会“消失”,[许多意想不到的] 注入攻击漏洞也会“消失”。 我没有使用框架,但可以使用 php PDO。这会解决这个问题吗?我以前使用过活动记录,但从未使用过 PDO。 PDO does indeed support placeholders -- 和 mysqli 一样(虽然我不喜欢 mysqli 方法),所以至少有两个“标准”选项可用。 【参考方案1】:

将列设置为 NULL 的正确 SQL 语法是:

  UPDATE Table SET Column = NULL WHERE . . .

(注意文字 NULL 周围没有引号)。

您是使用 SQL 还是使用某种框架执行此更新?如果是一个框架,它应该识别 NULL 值并为您正确地将它们传递给数据库。

【讨论】:

【参考方案2】:

经过大量研究,我发现如果您直接编写 sql 查询,这是一个众所周知的问题,没有好的解决方案。

正确的解决方案是使用数据库抽象层,如 PDO(用于 PHP)或 Active Record(用于 Codeignitor 和 Ruby on Rails 等框架)。

【讨论】:

以上是关于你如何正确地用 NULL 更新 mysql 字段?的主要内容,如果未能解决你的问题,请参考以下文章

mysql把一个表字段更新为另一个表字段

mysql 在值为null的字段插入数据!

如何使用 MySQL GUI 工具使字段为 NULL?

如何查询mysql字段记录为NULL的数据

mysql如何让时间属性不自动更新

SQL 如何把现有字段设为not null