更新到mysql 5.7后解决0000-00-00日期问题

本文详细介绍了MySQL 5.7默认开启的SQL Mode特性,特别是NO_ZERO_IN_DATE和NO_ZERO_DATE选项如何禁止使用0000这样的日期格式。并提供了具体的配置方法来调整这些选项。

mysql 5.7 默认开始用以下sql mode :

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION 

其中NO_ZERO_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间。因此在mysql的配置文件中,重新设置sql-mode,去掉这两项就可以了。如:

sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 

转载于:https://my.oschina.net/komodo/blog/919193

<think>嗯,用户的问题是关于如何在MySQL中查询日期字段值为0000-00-00 00:00:00的数据。首先,我需要回忆一下MySQL中关于日期处理的相关知识。根据之前的引用内容,用户可能遇到了导入数据时的问题,特别是因为sql_mode中的NO_ZERO_DATE和NO_ZERO_IN_DATE设置导致无法插入这样的日期值。但用户现在的问题是如何查询这些已经存在的数据。 首先,我需要确定用户使用的MySQL版本,因为不同版本对日期处理可能有差异。但用户没有提到版本,所以需要给出通用方法。根据引用[3],用户可能已经通过将日期设为NULL来处理这个问题,但查询时可能需要不同的方法。 接下来,考虑查询语句。直接使用WHERE date_column = '0000-00-00 00:00:00'可能会被MySQL拒绝,尤其是在严格模式下。但根据引用中的例子,用户可能的数据中有这样的值存在,比如引用[3]中提到的update语句,将早于1970年的日期设为NULL,说明表中可能存在这些零值日期。 可能的解决方法是使用字符串比较,或者检查是否允许零日期。如果sql_mode允许零日期,直接比较即可;否则,可能需要修改sql_mode临时生效。不过用户的问题只是查询,不是插入,所以可能不需要修改设置。 另外,需要注意的是,在严格模式下,即使查询也可能报错,但根据经验,查询应该还是允许的,只是插入或更新时会受限制。因此,正确的查询语句应该是SELECT * FROM table WHERE date_column = '0000-00-00 00:00:00'; 或者使用更安全的IS NULL,如果用户已经将部分零日期转为NULL的话,但用户明确要查的是零值,而不是NULL。 不过,考虑到MySQL可能在某些模式下不允许零日期,即使存在,查询时可能需要特别处理。或者,用户可能的数据中确实存在这样的值,所以直接查询即可。需要提醒用户注意sql_mode的影响,并建议数据清洗,如引用[3]中的做法,将零日期更新为NULL。 另外,日期类型如果是datetime或者timestamp,处理方式可能不同。Timestamp类型在MySQL 5.7及以上版本不允许零日期,而datetime可能允许,取决于sql_mode。用户的问题是关于date字段,可能指的是datetime类型。 总结步骤:1. 检查当前sql_mode是否允许零日期;2. 使用直接查询语句;3. 处理可能出现的错误;4. 建议数据清洗。同时,提供具体的查询示例和注意事项,比如临时修改sql_mode的方法,以及使用NULLIF函数或转换为字符串比较的方法作为备选方案。</think>以下是在MySQL中查询日期字段为$0000-00-00$值的具体方法及注意事项: ### 一、直接查询方法 1. **基础查询语句**(需临时关闭严格模式) ```sql SET SESSION sql_mode = ''; SELECT * FROM table_name WHERE date_column = '0000-00-00 00:00:00'; ``` 2. **安全查询语句**(通过字符串比较) ```sql SELECT * FROM table_name WHERE DATE_FORMAT(date_column, '%Y-%m-%d %H:%i:%s') = '0000-00-00 00:00:00'; ``` ### 二、注意事项 1. **sql_mode冲突**:默认配置包含$NO\_ZERO\_DATE$和$NO\_ZERO\_IN\_DATE$时会拦截零日期值[^2] 2. **字段类型影响**: - datetime字段允许存储零日期(需关闭严格模式) - timestamp字段在5.6+版本禁止存储零日期[^4] 3. **数据清洗建议**: ```sql UPDATE table_name SET date_column = NULL WHERE date_column < '1970-01-01'; ``` ### 三、验证步骤 1. 检查当前sql_mode配置 ```sql SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode; ``` 2. 临时修改会话模式 ```sql SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'; ``` ### 四、替代方案 使用NULLIF函数转换后查询: ```sql SELECT * FROM table_name WHERE NULLIF(date_column, '0000-00-00') IS NULL; ``` 建议在查询后执行数据清洗,将异常日期统一处理为NULL值,如引用[3]中通过`update tb_sku set create_time = NULL where create_time < '1970-01-01'`的方式解决数据兼容性问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值