libmysql版本不同是否会导致MySQL字段默认值校验逻辑存在差异?
问题核心原因
你遇到的行为差异和libmysql版本无关,本质是两台机器的MySQL服务端sql_mode配置不一致:
- 本地环境开启了严格模式,对NOT NULL无默认值的字段执行插入时未赋值会直接抛出1364错误,符合SQL标准规范
- 生产环境未开启严格模式,遇到上述场景时会自动填充对应字段类型的隐式默认值(varchar类型填充空字符串
''、数值类型填充0),不会抛出错误
验证方法
分别在本地、生产环境执行以下SQL查看当前生效的sql_mode:
SELECT @@sql_mode;
对比输出结果可以发现,生产环境的配置中缺少STRICT_TRANS_TABLES(针对事务引擎的严格模式)或STRICT_ALL_TABLES(针对所有引擎的严格模式)参数。
配置调整方案
如果需要让生产环境的校验逻辑和本地对齐,有两种调整方式:
- 永久生效:修改MySQL配置文件(一般为
my.cnf或my.ini),在[mysqld]段落中修改sql_mode配置,添加严格模式参数,示例如下:
[mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
修改后重启MySQL服务即可生效。
2. 临时生效(重启后失效):直接执行全局配置SQL:
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
内容的提问来源于stack exchange,提问作者jeyzorus
相关产品推荐
相关产品推荐

