我有一个“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,或者将它完全保留在更新查询之外,以避免此错误?我对吗?感谢!!!
答案 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
。
[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)
这取决于你如何声明你的表格。在:
中不允许使用NULLcreate 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(而不是 '')