You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向DATE类型字段插入/更新小数未触发预期错误的咨询

为什么MySQL插入/更新DATE类型列时传入浮点数未触发预期错误?

核心原因

MySQL默认的sql_mode未开启严格模式及相关日期校验规则,导致系统自动对传入的浮点数做隐式类型转换,而非抛出错误。

具体逻辑:

  • 当向DATE类型列传入浮点数时,MySQL会先截断小数部分取整数(比如0.08转为0,0.00020596...也转为0)。
  • 若未开启严格模式,MySQL会将整数0转换为0000-00-00(零日期)存入数据库,而非判定为非法值报错。

验证当前sql_mode设置

执行以下命令查看当前会话的sql_mode配置:

SELECT @@sql_mode;

如果结果中没有STRICT_TRANS_TABLES(事务表严格模式)、STRICT_ALL_TABLES(全表严格模式)、NO_ZERO_DATE(禁止零日期)这些选项,就会出现你遇到的情况。

解决方法:开启严格模式

临时生效(仅当前会话)

执行以下命令修改当前会话的sql_mode:

SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';

此时再执行你的插入/更新语句,就会触发预期的Incorrect date value错误。

永久生效(全局配置)

  1. 找到MySQL配置文件:Linux下通常是/etc/my.cnf或/etc/mysql/my.cnf,Windows下是my.ini(一般在MySQL安装目录的data或bin文件夹)。
  2. 在[mysqld]段添加或修改配置:
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
  1. 重启MySQL服务,配置即可永久生效。

补充说明

  • 严格模式开启后,MySQL会严格校验数据类型匹配性,任何不符合列类型的插入/更新操作都会直接抛出错误,而非自动转换或存入默认值。
  • NO_ZERO_DATE用于禁止0000-00-00这种无效日期,NO_ZERO_IN_DATE用于禁止日期中包含零的非法格式(比如2024-00-01)。

内容的提问来源于stack exchange,提问作者Vid Belgaum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:12:49