MySQL允许0000年份但Java读取报错,如何配置允许0000-01-01类日期?
问题1:MySQL存储0000年日期,Java读取报错的解决办法
- 在JDBC连接URL中添加参数,修改驱动对零日期的处理行为:
- 若想将0000格式日期转为null,添加:
zeroDateTimeBehavior=convertToNull,示例URL:jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull - 若想将0000格式日期转为合法的最小日期(0001-01-01),添加:
zeroDateTimeBehavior=round
- 若想将0000格式日期转为null,添加:
- 也可考虑将MySQL中的日期字段类型改为
VARCHAR,直接以字符串形式存储和读取,但这种方式会丢失日期类型的原生校验与运算能力,不推荐使用。
问题2:配置MySQL允许存储0000-01-01这类日期
MySQL的日期校验由sql_mode参数控制,要允许存储0000-01-01,需移除相关限制模式:
临时生效(重启MySQL后失效)
执行SQL命令修改全局sql_mode:
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
注意:上述命令移除了NO_ZERO_DATE和NO_ZERO_IN_DATE两个限制模式,你可根据自身需求保留其他必要模式。修改后新连接会立即生效,当前连接需重新连接才能应用新配置。
永久生效
- 找到MySQL配置文件:Linux系统通常为
/etc/my.cnf或/etc/mysql/my.cnf;Windows系统通常为my.ini(位于MySQL安装目录或Data目录下) - 在
[mysqld]段中修改sql_mode配置,移除NO_ZERO_DATE和NO_ZERO_IN_DATE:
[mysqld] sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
- 保存配置文件后,重启MySQL服务使配置生效。
补充说明:MySQL官方支持的合法日期范围是1000-01-01到9999-12-31,关闭零日期限制后虽允许存储0000-01-01这类“伪日期”,但仅能在宽松模式下使用,部分场景可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者user3309305
相关产品推荐
相关产品推荐

