向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错误。
永久生效(全局配置)
- 找到MySQL配置文件:Linux下通常是
/etc/my.cnf或/etc/mysql/my.cnf,Windows下是my.ini(一般在MySQL安装目录的data或bin文件夹)。 - 在
[mysqld]段添加或修改配置:
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
- 重启MySQL服务,配置即可永久生效。
补充说明
- 严格模式开启后,MySQL会严格校验数据类型匹配性,任何不符合列类型的插入/更新操作都会直接抛出错误,而非自动转换或存入默认值。
NO_ZERO_DATE用于禁止0000-00-00这种无效日期,NO_ZERO_IN_DATE用于禁止日期中包含零的非法格式(比如2024-00-01)。
内容的提问来源于stack exchange,提问作者Vid Belgaum
相关产品推荐
相关产品推荐

