如何在MySQL的日期时间字段中存储NULL值?

2022-08-30 10:30:18

我有一个“bill_date”字段,我希望该字段为空 (NULL),直到它被计费,此时将输入日期。

我看到MySQL不喜欢日期时间字段中的NULL值。你们中是否有人有一个简单的方法来处理这个问题,或者我是否被迫使用最小日期作为“NULL等效项”,然后检查该日期?

谢谢。

已编辑以添加:

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

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

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

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


答案 1

MySQL确实允许字段的值。我刚刚测试了它:NULLdatetime

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)

说到通过PHP代码插入NULL值,假设您正在使用预准备语句(您绝对应该这样做),插入NULL值没有问题。只需以通常的方式绑定变量,所有包含空值的PHP变量都将在MySQL中存储为NULL。

只需确保您的PHP变量确实包含NULL而不是空字符串即可。


答案 2

这是一个明智的观点。

空日期不是零日期。它们可能看起来一样,但它们不是。在 mysql 中,空日期值为空。零日期值是空字符串 ('') '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'。如果将 myDate 更新为“”或“0000-00-00 00:00:00”,则两种选择仍将相同。

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

我强烈建议只使用空日期,或者如果可以的话,只使用空日期。(一些系统将使用“virual”零日期,这是有效的公历日期,如1970-01-01(linux)或0001-01-01(预言机)。

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

空日期需要更好的照顾。当您插入或更新时必须小心,以免在null周围添加引号,否则将插入零日期而不是null,这会导致您的标准数据严重破坏。在搜索表单中,您将需要处理诸如“并且 mydate 不为 null”等情况。

空日期通常是更多的工作。但它们比查询的零日期快得多


推荐