我遇到了Zend_Db
或PHP的PDO MySQL驱动程序的奇怪问题,这可能源于我对这两者缺乏了解。
假设我有一个带有NULL
能TIME
字段的MySQL表。如果我在MySQL客户端中运行这样的查询:
UPDATE mytable SET mytime = NULL WHERE id = 1;
所有内容均按预期工作, mytime 字段将在此查询后保留NULL
作为值。
但是,如果我通过Zend_Db_Adapter
在PHP中运行完全相同的查询,则 mytime 字段在此类查询后设置为'0:0:0'
:
$db->getConnection()->exec('UPDATE mytable SET mytime = NULL WHERE id = 1');
如何将TIME字段设置为NULL?
我正在使用PHP5.3和PDO MySQL驱动程序,Zend Framework 1.11和MySQL 5.1。
答案 0 :(得分:1)
你应该工作,即:
$db->getConnection()->exec('UPDATE mytable SET mytime = NULL WHERE id = 1');
那应该有用。我测试了它。
如果数据类型时间为NOT NULL
,则尝试将其设置为NULL
会导致值NULL
默认为00:00:00
},这可能是意外行为,例如:
CREATE TABLE `test` (
`time` datetime NOT NULL
);
尝试使用NULL
插入或更新上方的时间字段会导致插入值00:00:00
。
这与日期,日期时间和其他一些数据类型类似。例如尝试将数据类型日期时间设置为NOT NULL
至 NULL
,其值将默认为0000-00-00 00:00:00
。
注意:当您尝试将NULL
值设置为NUT NULL
数据类型时,Mysql不会抛出错误,您可以通过将MySQL的SQL_MODE
设置为{}来更改此行为STRICT_ALL_TABLES
:请参阅this stackoverflow question。
更改字段以允许NULL
,它应该没问题:
CREATE TABLE `test` (
`time` datetime DEFAULT NULL
);
现在时间字段可以设置为NULL
。
答案 1 :(得分:0)
使用new Zend_Db_Expr('NULL')
代替NULL:
$zend_null = new Zend_Db_Expr('NULL');
$db->getConnection()->exec("UPDATE mytable SET mytime = $zend_null WHERE id = 1");