同版本MySQL 5.6.27在两台服务器上表现不同的原因排查
为什么两台MySQL 5.6.27服务器处理字符串插入bigint列的行为不同?
这事儿核心原因肯定是两台服务器的sql_mode配置不一样,尤其是严格模式(Strict Mode)的开关状态差异,直接导致了数据插入时的不同处理逻辑。
咱们拆解下两种行为对应的配置情况:
- 只警告并截断数据的服务器:没有启用严格模式,或者严格模式相关的关键参数未开启。当你插入
1_2_3_4这种不符合bigint类型的字符串时,MySQL会自动做“静默截断”——只提取字符串开头的合法数字部分(也就是1),同时抛出数据截断的警告,但允许这条记录插入。 - 直接报错拒绝插入的服务器:已经启用了严格模式。这时候MySQL会严格校验数据类型的匹配性,遇到这种无法完整转换为
bigint的字符串,直接抛出Data truncation错误,拒绝执行插入操作,从根源上避免不符合要求的数据进入数据库。
怎么验证这个配置差异?
你可以在两台服务器上分别执行这条SQL命令,查看返回的sql_mode参数:
SELECT @@sql_mode;
- 允许截断的那台,返回结果里不会包含
STRICT_TRANS_TABLES或STRICT_ALL_TABLES这两个严格模式的核心参数; - 报错的那台,
sql_mode里一定会包含STRICT_TRANS_TABLES(针对事务型表生效)或者STRICT_ALL_TABLES(针对所有表生效)。
补充个背景:MySQL 5.6的默认配置是不启用严格模式的,但很多运维人员或者自定义安装脚本会手动开启严格模式(毕竟更符合数据完整性要求),这也是两台服务器出现差异的最常见原因。
怎么统一两台服务器的行为?
如果想让两台机器处理逻辑一致,有两种选择:
- 统一开启严格模式(推荐):修改MySQL配置文件(Linux是
my.cnf,Windows是my.ini),在[mysqld]段添加或修改sql_mode配置,比如:
保存后重启MySQL服务,再用sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONSELECT @@sql_mode;确认配置生效。 - 统一关闭严格模式(不推荐):把
sql_mode里的STRICT_TRANS_TABLES和STRICT_ALL_TABLES参数移除,重启服务即可,但这种方式容易埋下数据不一致的隐患,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Manoj-kr
相关产品推荐
相关产品推荐

