代码之家  ›  专栏  ›  技术社区  ›  rhodesjason

如何在MySQL的日期时间字段中存储空值?

  •  35
  • rhodesjason  · 技术社区  · 16 年前

    我有一个“账单日期”字段,在账单开出之前,我希望该字段为空(空),此时将输入日期。

    我看到mysql不喜欢datetime字段中的空值。你们中是否有人有一个简单的方法来处理这个问题,或者我是否被迫使用最小日期作为“空等价物”,然后检查那个日期?

    谢谢。

    编辑添加:

    好的,我看到MySQL会接受空值,但是如果我使用PHP更新记录,它不会接受它作为数据库更新。

    变量名为 $bill_date 但是如果我更新一个记录而不向发送值,它不会将变量保留为空。 比利时日期 --我得到这个错误:

    Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1
    

    我假设我需要实际发送空值这个词,或者将它完全从更新查询中删除,以避免这个错误?我说的对吗?谢谢!!!!

    8 回复  |  直到 11 年前
        1
  •  47
  •   Community Mohan Dere    9 年前

    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 .空字符串与 无效的 并且不是有效的 日期时间 值,这就是您收到错误消息的原因。必须传递特殊的SQL关键字 无效的 如果这就是你的意思。另外,不要在单词周围加引号 无效的 . 看到我 insert 上面的语句作为如何插入的示例 无效的 .

    编辑2:您使用PDO吗?如果是,绑定空参数时,请确保使用 [PDO::PARAM_NULL][1] 绑定时键入 无效的 . 见 answer to this stackoverflow question 关于如何正确插入 无效的 使用PDO。

        2
  •  20
  •   roselan    15 年前

    这是一个明智的观点。

    空日期不是零日期。它们看起来可能相同,但不是。在MySQL中,空日期值为空。零日期值是空字符串(“”) '0000-00-00 00 00:00:00'

    在无效日期“…其中mydate=''将失败。
    在空/零日期“…如果mydate为空,“将失败。

    但现在让我们来做个有趣的事情。在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”。如果将mydate更新为“”或“0000-00-00 00:00:00”,两个选项的工作方式都将相同。

    在PHP中,mysql空日期类型将与标准的mysql连接器一起使用,并且为真正的空值($var==null,is_null($var))。空日期将始终表示为“0000-00-00 00:00:00”。

    我强烈建议只使用空日期,如果可以,也只使用空日期。(有些系统将使用“虚拟”零日期,这是有效的公历日期,如1970-01-01(Linux)或0001-01-01(Oracle)。

    在php/mysql中,空日期更容易。您没有要处理的“Where字段为空”。但是,您必须“手动”转换“”中的“0000-00-00 00:00:00”日期以显示空字段。(存储或搜索您没有处理零日期的特殊情况,这很好)。

    空日期需要更好的照顾。插入或更新时必须小心,不要在空值周围添加引号,否则将插入零日期而不是空值,这会导致标准数据的混乱。在搜索表单中,您需要处理“和mydate不为空”等情况。

    空日期通常比较有用。但是他们很多 查询的日期快于零。

        3
  •  5
  •   Manoochehr Dadashi    13 年前

    我在窗户上遇到了这个问题。

    这就是解决方案:

    若要为空传递“”,应禁用 STRICT_MODE (在Windows安装上默认启用)

    顺便说一句,传递“”为空是很有趣的。我不知道他们为什么让这种行为发生。

        4
  •  3
  •   Andomar    16 年前

    这取决于你如何申报你的桌子。在以下位置不允许空值:

    create table MyTable (col1 datetime NOT NULL);
    

    但允许出现以下情况:

    create table MyTable (col1 datetime NULL);
    

    第二个是默认值,因此必须有人主动决定该列不应为空。

        5
  •  2
  •   Rob    16 年前

    我刚在MySQLv5.0.6中测试过,datetime列接受了空值,没有问题。

        6
  •  2
  •   Joe M    13 年前

    值得一提的是:我在尝试通过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]);
        ...
    
        7
  •  2
  •   tomvodi    11 年前

    我刚刚发现,如果字段的默认值为空,MySQL将采用空值,并且我会编写特定的if语句,并去掉引号。这也适用于更新。

    if(empty($odate) AND empty($ddate))
    {
      $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' ";
    };
    
        8
  •  1
  •   Lukey    13 年前

    具体来说,对于MySQL中可以为空的字段,在PHP中不能这样做:

    $sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')';
    

    因为php中的空字符串等于 与MySQL中的空值相同。相反,您希望这样做:

    $sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')';
    

    当然,您不必使用is_null,但我认为它可以更好地演示这一点。使用empty()或类似的方法可能更安全。如果$col2恰好是一个字符串,您可以在查询中用双引号括起来,不要忘记 包括“空”字符串周围的那些,否则它将不起作用。

    希望有帮助!