1

我创建了一个列

`date_start` datetime NOT NULL DEFAULT '1970-01-01'

但是,当我使用 LOAD DATA 命令从 CSV 文件上传数据时,date_start保存的值为 0000-00-00 00:00:00 的空白条目?

4

5 回答 5

2

NULL和“空白条目”在 MySql 中并不总是被同等对待。在datetime数据类型的情况下,空白条目会自动转换为 0000-00-00 00:00:00。您可以将其视为一种类型转换,其中空白被类型转换为零。

DEFAULT在您的数据文件中,尝试用关键字替换所有空白日期。

于 2010-09-08T15:50:41.870 回答
0

datetime表示您的列以Y-m-d H:i:s( 0000-00-00 00:00:00) 格式存储日期和时间。

date表示您的列仅以Y-m-d( 0000-00-00) 格式存储日期。

于 2010-09-08T15:37:08.287 回答
0

如果您在插入数据时不指定值,则使用默认值,但当您从 CSV 文件插入数据时,它会为字段指定值,因此不使用默认值。

空白条目是日期时间字段的无效值,因此0000-00-00 00:00:00使用该值代替,就像任何无法解析为有效日期(或部分日期)的值一样。

于 2010-09-08T15:51:27.360 回答
0

MySQL SQL 模式默认允许零日期。

我的信念是 LOAD DATA INFILE 命令正在读取旨在成为 DATETIME 的空白位置,并在插入之前自动使用零日期。这可以解释为什么没有应用您的默认约束 - 插入时该值不为空。

我认为你有两个选择:

  1. 将 CSV 中的所有空格从 ", ," 更新为 ", NULL, " 或 ", DEFAULT, ",以便正确解释它们
  2. 更改 SQL 模式SET SQL_MODE='NO_ZERO_DATE'
于 2010-09-08T15:55:39.920 回答
0

MySQL 有一个烦人的(在我看来)行为,在某些情况下,如果给定一个无效值来存储在列中,它将存储一个预定义的“错误值”。例如,在日期或日期时间上下文中,它将存储您注意到的“零日期”;对于 ENUM 列,它将存储 ''(对应于数字上下文中的 0)作为错误值。

虽然它不优雅,但您可以尝试进行导入并允许插入无效的零日期,然后发出

UPDATE
    table_name
SET
    date_start = '1970-01-01 00:00:00'
WHERE
    date_start = '0000-00-00 00:00:00'
于 2010-09-08T15:57:19.017 回答