我在这里和其他地方看到几个问题在某些情况下可以解决这个问题,但不是我需要的。
我正在使用一个脚本,该脚本存储了一个值数组,以便根据更改进行插入或更新。
有些日期/时间已设置,有些为空。 我正在尝试使用 $var=NULL,然后插入插入...("{$var}"),如果为 null,则获取 00:00:00 的时间,如果设置了时间,则获取时间。
使用 $var="NULL" 插入并插入到 ...('{$var}'),如果为 null,则获取 00:00:00,如果设置了时间,则获取时间。
如果我删除插入的引号...({$var}) 如果为 null,则有效,但如果日期不为 null,则当然会失败。
我有另一个 VARCHAR 字段,我正在做同样的事情,它工作正常。 即,如果有一个字符串,它作为字符串传入,如果它是空的,我正在设置 var=null。 我在插入查询中使用引号,如果它是空的,它作为空进入,如果不是空, 字符串插入。
使用条件语句将需要相当大的重写,所以我希望避免这种情况。
任何关于如何在没有 IF 语句的情况下完成这项工作的建议(如果可能的话)都会有所帮助。
谢谢。
我已经测试了几种方法,如果不使日期/时间字段成为 VARCHAR,我就无法获得所需的结果,我不想这样做。 这是数据库结构,插入查询和结果。
id int(11) No None AUTO_INCREMENT
event_new_date_start date Yes NULL
event_new_time_start time Yes NULL
event_link varchar(150) latin1_swedish_ci Yes NULL
$event_new_date_start1 = 'NULL';
$event_new_time_start1 = 'NULL';
$event_link1 = 'NULL';
$event_new_date_start2 = '2011-04-04';
$event_new_time_start2 = '13:13';
$event_link2 = 'http://abc.com';
$event_new_date_start3 = NULL;
$event_new_time_start3 = NULL;
$event_link3 = NULL;
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start1}', '{$event_new_time_start1}', '{$event_link1}')
");
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start2}', '{$event_new_time_start2}', '{$event_link2}')
");
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start3}', '{$event_new_time_start3}', '{$event_link3}')
");
1 0000-00-00 00:00:00 NULL
2 2011-04-04 13:13:00 http://abc.com
3 0000-00-00 00:00:00
当我将日期/时间字段更改为 CHAR 时,它在查询中使用引号按预期工作。
4 NULL NULL NULL
5 2011-04-04 13:13 http://abc.com
6
使用引号,那么您是在说您希望日期是字符串'NULL'
。MySQL无法将其解析为有效日期,因此它会回退到0
。
设置 $var
的值时,如果它不为 null,则将其设置为仅 NULL
或带引号的字符串,则只需在查询中使用 ({$var})
而不是 ('{$var}')
即可。
rdineiu 是对的,问题是你插入了"null"这个词。MySQL不理解这一点,因此它没有给出错误(像许多数据库那样),而是插入了一个全零的时间。这在 Java 中特别有趣,因为尝试读取该值会导致引发异常。
最好的办法是使用 DBO 迁移到参数化 SQL 查询。您可以在SO上找到更多与此问题和答案相关的一些链接。这不仅可以解决您的问题,还可以解决插入和回读其他值时可能发生的(一些)SQL 注入问题。
如果不这样做(同样,你应该并且是正确的答案),你可以在没有引号的情况下进行插入("({$var})"),并通过一个函数运行日期,如果它不为 null,则附加必要的引号。但是,如果您直接从用户那里获取日期值,这将不会保护您,如果您有一个希望为空的字符串字段,则会遇到同样的问题。
MySQL经常做这样完全愚蠢的事情;请参阅MySQL"陷阱"的有用列表。 在这种情况下,我希望您的日期字段不是 NULL,并且您的 SQL 合规性模式不是很严格;这会导致MySQL输入默认日期0,而不是您实际要求它执行的NULL。 更改您的架构以使您的日期字段默认为空,这应该消失。
请注意,如果您进行其他人建议的更改,例如插入 NULL 而不是带引号的"NULL",这将起作用。