我创建了一个
列`date_start` datetime NOT NULL DEFAULT '1970-01-01'
但是,当我使用带有date_start
空白条目的LOAD DATA命令从CSV文件上传数据时,保存的值为0000-00-00 00:00:00?
答案 0 :(得分:1)
NULL
和“空白条目”并不总是相同。在datetime
数据类型的情况下,空白条目自动转换为0000-00-00 00:00:00。您可以将其视为一种类型转换的形式,其中空白将类型转换为零。
在您的数据文件中,尝试使用DEFAULT
关键字替换所有空白日期。
答案 1 :(得分:0)
datetime
表示您的列以Y-m-d H:i:s
(0000-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的空白位置,并在插入前自动使用零日期。这可以解释为什么没有应用默认约束 - 插入时该值不为空。
我认为你有两个选择:
SET 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'