繁体   English   中英

mysql“ datetime NOT NULL DEFAULT'1970-01-01'”变成了注册00:00:00

[英]mysql “datetime NOT NULL DEFAULT '1970-01-01' ” gets turned to 0000-00-00 00:00:00

我创建了一个专栏

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

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

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

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

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

date表示您的列仅以Ymd0000-00-00 )格式存储日期。

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

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

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

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

我认为您有两种选择:

  1. 将CSV中的所有空格从“,”更新为“,NULL,”或“ DEFAULT”,以便正确解释
  2. 更改SQL模式SET SQL_MODE='NO_ZERO_DATE'

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

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

UPDATE
    table_name
SET
    date_start = '1970-01-01 00:00:00'
WHERE
    date_start = '0000-00-00 00:00:00'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM