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 确实允许字段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)
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快于零个日期查询.
我在Windows上遇到了这个问题.
这是解决方案:
要传递''为NULL,您应该禁用STRICT_MODE(在Windows安装时默认启用)
BTW传递''为NULL是很有趣的.我不知道为什么他们会采取这种行为.