如何在MySQL的datetime字段中存储NULL值?

时间:2009-11-06 23:01:22

标签: php mysql datetime null

我有一个“bill_date”字段,我想要空白(NULL),直到收费为止,此时将输入日期。

我看到MySQL不喜欢datetime字段中的NULL值。你们中的任何人都有一个简单的方法来处理这个问题,或者我被迫将最小日期作为“等效的NULL”然后检查那个日期?

感谢。

已编辑添加:

好的我确实看到MySQL会接受NULL值,但如果我用PHP更新记录,它就不会接受它作为数据库更新。

变量名是$bill_date但如果我更新记录而不向$bill_date发送值,它不会将变量保留为NULL - 我收到此错误:

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1

我假设我需要实际发送单词NULL,或者将它完全保留在更新查询之外,以避免此错误?我对吗?感谢!!!

9 个答案:

答案 0 :(得分:49)

MySQL 允许NULL字段的datetime值。我刚测试过它:

mysql> create table datetimetest (testcolumn datetime null default null);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into datetimetest (testcolumn) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from datetimetest;
+------------+
| testcolumn |
+------------+
| NULL       | 
+------------+
1 row in set (0.00 sec)

我正在使用这个版本:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.45    | 
+-----------+
1 row in set (0.03 sec)

编辑#1:我在编辑中看到你在PHP中收到的错误消息表明你传递的是一个空字符串(即''),而不是null。空字符串与null不同,并且不是有效的datetime值,这就是您收到该错误消息的原因。如果这是你的意思,你必须传递特殊的sql关键字null。另外,请勿在单词null周围加上任何引号。请参阅上面的insert声明,了解如何插入null

编辑#2:你在使用PDO吗?如果是这样,当您绑定空参数时,请确保在绑定[PDO::PARAM_NULL][1]时使用null类型。有关如何使用PDO正确插入null,请参阅answer to this stackoverflow question

答案 1 :(得分:20)

这是一个明智的观点。

空日期不是零日期。它们可能看起来一样,但事实并非如此。在mysql中,null日期值为null。零日期值为空字符串('')'0000-00-00 00:00:00'

在空日期“......其中mydate =''”将失败 在空/零日期“...... mydate为null”将失败。

但现在让我们变得时髦。在mysql日期中,空/零日期严格相同。

通过示例

select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '';
select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '0000-00-00 00:00:00'

将两个输出:'0000-00-00 00:00:00'。如果你用''或'0000-00-00 00:00:00'更新myDate,两个选择仍然可以正常工作。

在php中,mysql null date类型将使用标准的mysql连接器,并且是真正的空值($ var === null,is_null($ var))。空日期将始终表示为'0000-00-00 00:00:00'。

我强烈建议您只使用空日期,或者只使用空日期。 (某些系统将使用“虚假”零日期,这些日期是有效的格里高利日期,如1970-01-01(linux)或0001-01-01(oracle)。

在php / mysql中,空日期更容易。您没有要处理“where field is null”。但是,您必须“手动”转换''中的'0000-00-00 00:00:00'日期以显示空字段。 (存储或搜索你没有特殊情况来处理零日期,这很好)。

空日期需要更好的照顾。插入或更新时不得不小心在null周围添加引号,否则将插入零日期而不是null,这会导致标准数据破坏。在搜索表单中,您需要处理“和mydate不为空”之类的情况,依此类推。

空日期通常更多。但它们比查询的零日期更快很多

答案 2 :(得分:5)

我在Windows上遇到了这个问题。

这是解决方案:

要传递''为NULL,您应该停用 STRICT_MODE (在Windows安装时默认启用)

BTW传递''为NULL很有趣。我不知道为什么他们会采取这种行为。

答案 3 :(得分:3)

这取决于你如何声明你的表格。在:

中不允许使用NULL
create table MyTable (col1 datetime NOT NULL);

但它将被允许:

create table MyTable (col1 datetime NULL);

第二个是默认值,所以有人必须主动决定该列不应该为空。

答案 4 :(得分:2)

我刚刚在MySQL v5.0.6中测试过,而datetime列在没有问题的情况下接受了null。

答案 5 :(得分:2)

对于它的价值:我在尝试通过Perl更新MySQL表时遇到了类似的问题。当空字符串值(从另一个平台读取的空值转换)传递到日期列时,更新将失败(下面的代码示例中为' dtcol')。我最终成功地通过使用嵌入在我的更新语句中的IF语句来更新数据:

    ...
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?';
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]);
    ...

答案 6 :(得分:2)

我刚刚发现,如果该字段的默认值为null,则MySQL将采用null,并且我会编写特定的if语句并且不使用引号。这也适用于更新。

if(empty($odate) AND empty($ddate))
{
  $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' ";
};

答案 7 :(得分:1)

特别是与你得到的错误有关,你不能在PHP中为MySQL中的可空字段做这样的事情:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')';

因为PHP中的null将等同于一个空字符串,该字符串与MysQL中的NULL值相同。相反,你想这样做:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')';

当然你不必使用is_null,但我认为它表明了一点好一点。使用empty()或类似的东西可能更安全。如果$ col2恰好是一个字符串,你可以在查询中用双引号括起来,不要忘记包含'NULL'字符串周围的字符串,否则它不会工作。

希望有所帮助!

答案 8 :(得分:0)

如果您的日期时间列不接受空值,则它可能不可为空,因此您可以使用以下命令更新该列:

ALTER TABLE your_table modify your_coloumn datetime null

当你想保存一个空字段时,你可以不理会它(不给那个字段分配任何东西),或者你可以将它设置为 Null(而不是 '')