【问题标题】:MySQL, how to insert null datesMySQL,如何插入空日期
【发布时间】:2013-07-20 23:59:57
【问题描述】:

我在将空值插入 MySQL 表中的日期字段时遇到问题。

这是插入查询:

$query = 'INSERT INTO table (column_s1, column_s2, column_d1, column_d2)
VALUES ("'.$string1.'", "'.$string2.'", '.$date1.', '.$date2.')';

s1 和 s2 列采用字符串值,d1 和 d2 采用日期。当我只使用字符串字段运行此查询时,没有问题。

日期值可以设置或为空,所以我没有在查询中包含引号,而是在前面将它们添加到变量中。这是我用来设置日期值的 php 代码:

if (empty($date1)){
    $date1 = NULL;
}
else{
    $date1part = explode("/",$date1);
    $date1 = '"'.$date1part[2].'/'.$date1part[1].'/'.$date1part[0].'"';
}

当日期值全部设置好后,记录就被正确插入了。但是,当任一日期为空时,不会插入任何内容。

为什么我不能像这样在 MySQL 中插入空值?

【问题讨论】:

  • 您收到的错误信息是什么?数据库是否已设置为允许空值?没有限制?
  • 用例.. case when $date1 != null then $date1 else null end
  • 我不能让它产生任何错误信息?据我所知,它似乎认为它被插入了。有什么方法可以建议调试吗?是的,数据库接受空值。当我使用 SQL 命令空间时,它允许我在其中插入 NULL 值,似乎只有当它来自我的 php 时。
  • @deceze:感谢您链接到这个问题。我已经尝试过该解决方案(我认为),但显然情况略有不同,因为它现在似乎已经解决了我的问题。问题是它采用 php null 值而不是将 null 输入到 SQL 中。非常感谢。

标签: php mysql date null sql-insert


【解决方案1】:

反斜杠 N 是 MySQL 中表示 NULL 的另一种方式。

尝试将值(反斜杠 N):\N 放入如下参数之一:

$data1 = "\N";
$sql="insert into tablename set column_s1='" . $data1 . 
  "', column_s2='" . data2 . 
  "', column_s3='" . $data3 . "'";

参考:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

【讨论】:

  • 否,这与 OP 查询相同 + 仍然不适用于 NULL 值。
【解决方案2】:

试试这个:

$query = "INSERT INTO table (column_s1, column_s2, column_d1, column_d2) 
          VALUES ('$string1', '$string2', " . ($date1==NULL ? "NULL" : "'$date1'") . ", " . ($date2==NULL ? "NULL" : "'$date2'") . ");";

例如,如果您将其放入查询中:

$string1 = "s1";
$string2 = "s2";
$date1 = NULL;
$date2 = NULL;

结果应该是:

INSERT INTO table (column_s1, column_s2, column_d1, column_d2) VALUES ('s1', 's2', NULL, NULL);

【讨论】:

  • 谢谢,这是对我有用的最好和最聪明的答案
【解决方案3】:

您应该先将空变量转换为空字符串 像这样:

if(is_null($date1)){
    $date1 = 'NULL';
}

如果您使用的是 MySQL 日期列,则还必须指定它在创建时应为 null,如下所示:

CREATE TABLE `table` (
id INT NOT NULL AUTO_INCREMENT,
date DATE NULL DEFAULT NULL,
PRIMARY KEY(id)
)

使用绑定参数执行查询也很重要,例如使用 pdo

  1. http://www.php.net/manual/en/pdo.construct.php
  2. http://php.net/manual/en/pdo.prepared-statements.php
  3. How do I insert NULL values using PDO?

类似这样的:

$query = 'INSERT INTO table (column_s1, column_s2, column_d1, column_d2)
VALUES (?, ?, ?, ?)';
$stmt = $db->prepare($query);
$stmt->execute(array($string1,$string2,$date1,$date2));

【讨论】:

    【解决方案4】:

    在 Derby 中,如果要插入已声明为 Null 的值以外的值(column_d1,column_d2),sql:

    INSERT INTO DB.table (column_s1, column_s2) VALUES ('s1', 's2');
    

    【讨论】:

      【解决方案5】:

      此时可能不需要答案,但我找到了我一直在寻找的解决方案。像这样使用Expression 传递NULL

      ['some_date_to_update' => new Expression('NULL')]
      

      因此,MySQL 将了解您想要什么,并将(NULL) 保存在数据库中,而不是存储 0 日期。希望这会对某人有所帮助。

      【讨论】:

        【解决方案6】:

        如果 NULL 不起作用,只需将您的日期传递为“0000-00-00”:

        $chequeDate = "0000-00-00";
        

        【讨论】:

        • 这将在 MySQL 5.7 或更高版本中引发警告或错误。默认情况下不允许使用零值日期,也不推荐使用。
        【解决方案7】:

        Mysql中DATE数据类型默认NULL表示

        部分版本设置为0000-00-00

        部分版本设置为1970-01-01

        【讨论】:

          猜你喜欢
          • 2017-04-13
          • 1970-01-01
          • 2016-05-24
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多