MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

本文详细介绍了在使用Navicat导入数据时遇到的datetime值为0导致的错误,并提供了通过修改MySQL的sql_mode来解决问题的方法。包括查看和修改全局及当前sql_mode,以及在MySQL配置文件中永久设置sql_mode。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


问题


用navicat导入数据时,报错:
[Err] 1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'CREATE_TIME' at row 1

在这里插入图片描述


原因

这是因为当前的MySQL不支持datetime为0的情况。


解决

修改sql_mode:

sql_mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。


全局sql_mode

查看全局sql_mode:

select @@global.sql_mode;

可以看到,O_ZERO_DATE、NO_ZERO_IN_DATE,把这两个设置去掉。

在这里插入图片描述

修改全局sql_mode:

set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

在这里插入图片描述

当前sql_mode

查看当前sql_mode:

select @@sql_mode;

在这里插入图片描述修改当前sql_mode:

set @@sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

在这里插入图片描述

OK,问题解决。

在这里插入图片描述


上面虽然也可以解决我们的问题,但是一旦MySQL重启,就必须重新设置一次全局和当前的sql_mode。

修改sql_mode配置

在MySQL配置文件mysql.ini中修改sql_mode配置,就不需要每次重启MySQL就得重新设置sql_mode了。

  • 关闭MySQL
net stop MySQL57
  • 修改MySQL配置
    在my.ini的[mysqld]下添加:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  • 启动MySQL
net start MySQL57


END!



参考:

【1】:https://my.oschina.net/shadowolf/blog/3005188
【2】:https://www.cnblogs.com/mmyy-blog/p/9626326.html
【3】:MySQL事务、锁、SQLMode、分区

<think>首先,用户的问题是关于解决MySQL错误1292:"Incorrectdatetimevalue&#39;0000-00-0000:00:00&#39;forcolumn&#39;refund_last_time&#39;solution"。这是一个数据库问题,我需要提供解决方案。从系统级指令中,我需要:-使用$...$格式的行内数学表达式(尽管在这个上下文中可能不需要数学)。-独立公式使用$$...$$格式。-确保LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识。-回答结构清晰,逐步解决问题。-参考站内引用(提供的引用是关于MySQL错误1292的)。提供的引用:-[^1]:ERROR1292(22007):Incorrectdatetimevalue:0000-00-0000:00:00forcolumncreated_on’atrow13-[^2]:解决Navicat运行sql文件报错:1292-Incorrectdatetimevalue:0000-00-0000:00:00forcolumn...。情况一:值直接是0000-00-00;情况二:默认值是0000-00-00。原因是数据库不支持datetime为0,模式设置问题。-[^3]:1292IncorrectdatetimevalueforcolumntargetTime。解决方案:关闭NO_ZERO_DATESQL模式。-[^4]:MySQL:[Err]1292-Incorrectdatetimevalue。修改sql_mode。这些引用解释了错误的原因:MySQL5.7及以上版本默认启用SQL模式,包括NO_ZERO_DATE和NO_ZERO_IN_DATE,这不允许使用&#39;0000-00-0000:00:00&#39;这样的无效日期时间值。用户的具体问题是关于列&#39;refund_last_time&#39;的,但解决方案是通用的。我的回答结构:1.**解释错误原因**:简要说明错误是什么和为什么发生。2.**提供解决方案**:逐步指导如何解决。3.**生成相关问题**:在末尾添加相关问题。4.**添加引用标识**:在引用站内内容时添加[^n]。解决方案步骤:-检查SQL模式:使用`SELECT@@sql_mode;`查看当前模式。-修改SQL模式:移除NO_ZERO_DATE和NO_ZERO_IN_DATE。-临时修改:`SETGLOBALsql_mode=&#39;modes_here&#39;;`-永久修改:编辑MySQL配置文件(如my.cnf或my.ini),添加或修改sql_mode。-替代方案:避免使用&#39;0000-00-00&#39;,使用NULL或有效日期。确保回答真实可靠:基于标准MySQL知识。使用中文回答。最后,生成相关问题:基于主题,如其他MySQL错误、SQL模式设置等。</think>### MySQL错误1292Incorrect datetime value &#39;0000-00-00 00:00:00&#39; for column &#39;refund_last_time&#39;解决方案 这个错误发生在MySQL 5.7及以上版本中,当您尝试插入或更新日期时间列(如`refund_last_time`)时使用了无效值`0000-00-00 00:00:00`。根本原因是MySQL默认启用了严格的SQL模式(如`NO_ZERO_DATE`和`NO_ZERO_IN_DATE`),禁止使用“伪日期”值。下面我将分步解释原因并提供可靠解决方案,确保数据安全。 #### 错误原因分析 - **SQL模式限制**:MySQL 5.7+ 默认SQL模式包含`NO_ZERO_DATE`和`NO_ZERO_IN_DATE`,这禁止`0000-00-00`这类无效日期时间值[^2][^3]。 - **常见触发场景**: - 直接SQL语句中指定了`0000-00-00 00:00:00`作为值。 - 列(如`refund_last_time`)的默认值被设置为`0000-00-00 00:00:00`,且未显式提供有效值。 - 从旧数据库导入数据时,包含无效日期记录[^1][^4]。 - **数学表达示例**:在数据库查询中,日期时间处理可类比为不等式约束,例如列值必须满足$t \geq &#39;1000-01-01&#39;$,否则违反SQL模式规则。 #### 逐步解决方案 遵循以下步骤解决问题,优先推荐方法1或2以避免安全隐患。操作前请备份数据库。 1. **临时修改SQL模式(快速测试)** 在MySQL客户端中执行: ```sql -- 查看当前SQL模式 SELECT @@sql_mode; -- 移除NO_ZERO_DATE和NO_ZERO_IN_DATE(示例模式:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES...) SET GLOBAL sql_mode = &#39;ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;; ``` - **优点**:立即生效,适合临时修复。 - **缺点**:MySQL重启后失效[^3][^4]。 2. **永久修改SQL模式(推荐生产环境)** 编辑MySQL配置文件(如`my.cnf`或`my.ini`),在`[mysqld]`部分添加: ```ini sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" ``` - 保存后重启MySQL服务。 - **验证**:重启后运行`SELECT @@sql_mode;`确认`NO_ZERO_DATE`和`NO_ZERO_IN_DATE`已移除[^4]。 3. **修复数据源(根本性解决)** - **方案A**:将无效值替换为`NULL`或有效日期(如`1970-01-01 00:00:00`)。 ```sql -- 示例:更新refund_last_time列为NULL UPDATE your_table SET refund_last_time = NULL WHERE refund_last_time = &#39;0000-00-00 00:00:00&#39;; ``` - **方案B**:修改列默认值,避免使用`0000-00-00`。 ```sql ALTER TABLE your_table ALTER COLUMN refund_last_time SET DEFAULT NULL; ``` - **优点**:无需修改SQL模式,保持数据一致性[^2]。 4. **导入数据时的特殊处理** 如果错误发生在导入SQL文件时: - 在导入命令中添加`--sql-mode=""`参数: ```bash mysql -u user -p --sql-mode="" database_name < file.sql ``` - 或在Navicat等工具中,临时禁用严格模式[^2]。 #### 注意事项 - **版本兼容性**:MySQL 8.0 默认SQL模式更严格,优先推荐方法3修复数据。 - **安全风险**:关闭`NO_ZERO_DATE`可能允许无效日期,导致查询逻辑错误。仅在必要时使用,并彻底测试[^3][^4]。 - **性能影响**:修改SQL模式对性能无直接影响,但无效日期可能导致索引失效。 通过上述步骤,错误1292应能解决。如果问题持续,检查列数据类型是否为`DATETIME`或`TIMESTAMP`,并确保应用程序未发送无效值。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三分恶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值