我在这里和其他地方看到了一些问题,在某些情况下会解决这个问题,但不是我需要的问题。
我正在使用一个脚本来存储一组值,以根据更改执行插入或更新。
设置了一些日期/时间,有些日期/时间为空。我正在尝试使用$ var = NULL,然后使用insert插入...('{$ var}')并获得00:00:00的时间(如果为null)和时间(如果设置了时间)。
使用$ var =“NULL”插入并插入到...('{$ var}')并获得00:00:00(如果为null)和时间(如果设置了时间)。
如果我删除插入的引号...({$ var})它的作用是null,但如果日期不为null,它当然会失败。
我有另一个VARCHAR字段我正在做同样的事情,它工作正常。即如果有一个字符串,它将作为字符串传入,如果它是空的,我设置var = null。我在插入查询上使用引号,如果它为null,则为null,如果不为null,则插入字符串。
使用条件语句将需要相当大的重写,所以我希望避免这种情况。
关于如何在没有IF语句(如果可能)的情况下完成这项工作的任何建议都会有所帮助。
感谢。
我已经测试了这几种方法,如果没有制作日期/时间字段VARCHAR,我无法获得所需的结果,我不想这样做。这是db结构,插入查询和结果。
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
答案 0 :(得分:5)
如果您使用引号,那么您说您希望日期为字符串'NULL'
。 MySQL无法将其解析为有效日期,因此它会回退到0
。
设置$var
的值时,将其设置为NULL
或带引号的字符串(如果它不为空),则只需在查询中使用({$var})
而不是('{$var}')
}。
答案 1 :(得分:1)
rdineiu是对的,问题是你插入了“null”这个词。 MySQL不理解这一点,因此它不是给出错误(就像许多DB那样),而是插入全零的时间。这在Java中特别有趣,因为尝试读取该值将导致抛出异常。
最好的办法是使用DBO转向参数化SQL查询。您可以通过this question and answer on SO找到更多信息和一些链接。这不仅可以解决您的问题,还可以解决(某些)SQL插入问题,这些问题可能会在插入和读回其他值时发生。
如果不这样做(这又是你应该而且是正确的答案),你可以不带引号(“({$ var})”)插入,并通过追加必要的函数运行日期引号如果不为null。但是,如果您直接从用户那里获得日期值,这将无法保护您,如果您想要可以为空的字符串字段,则会遇到同样的问题。
答案 2 :(得分:0)
MySQL经常做这样的蠢事;请参阅此MySQL "gotchas"的有用列表。在这种情况下,我希望你的日期字段是非NULL,你的SQL合规模式不是很严格;这会导致MySQL输入默认日期0而不是您实际要求它执行的NULL。更改您的架构,使您的日期字段DEFAULT为NULL,这应该消失。
请注意,如果您进行其他人建议的更改,这将有效,例如:插入NULL而不是引用的'NULL'。