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

rho*_*son 40 php mysql null datetime

我有一个"bill_date"字段,我希望它是空白的(NULL),直到它被计费,此时将输入日期.

我看到MySQL不喜欢datetime字段中的NULL值.你们有没有一个简单的方法来处理这个,或者我被迫使用最小日期作为"等效的NULL",然后检查那个日期?

谢谢.

编辑添加:

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

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

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1
Run Code Online (Sandbox Code Playgroud)

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

Asa*_*aph 50

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)
Run Code Online (Sandbox Code Playgroud)

我正在使用这个版本:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.45    | 
+-----------+
1 row in set (0.03 sec)
Run Code Online (Sandbox Code Playgroud)

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

编辑#2:你在使用PDO吗?如果是这样,当您绑定空参数时,请确保[PDO::PARAM_NULL][1]在绑定时使用该类型null.请参阅有关如何使用PDO 正确插入的此stackoverflow问题答案null.


ros*_*lan 21

这是一个明智的观点.

空日期不是零日期.它们可能看起来一样,但事实并非如此.在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不为空"等情况,等等.

空日期通常更多.但他们很多很多MUCH快于零个日期查询.


abz*_*rak 7

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

这是解决方案:

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

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