mysql“datetime NOT NULL DEFAULT'1970-01-01'”转到0000-00-00 00:00:00

时间:2010-09-08 15:29:49

标签: sql mysql load-data-infile default-constraint

我创建了一个

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

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

5 个答案:

答案 0 :(得分:1)

在MySql中,

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

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

答案 1 :(得分:0)

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

date表示您的列只以[{1}}(Y-m-d)格式存储日期。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

默认情况下,MySQL SQL模式允许零日期。

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

我认为你有两个选择:

  1. 将CSV中的所有空格从“,”更新为“,NULL”或“,默认”,以便正确解释
  2. Change the SQL modeSET SQL_MODE='NO_ZERO_DATE'

答案 4 :(得分: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'