MySQL的不同SQL模式导致行为不同?

现象:

我在两个mysql库都有相同定义的表,其中一个字段是varchar(1200)。当我都对这个表进行insert操作,而且超过此字段的规定长度(此处是1200),这两库的行为是不一样的:库B是直接报错too long,库A却不报错,只是在程序后台观察到返回了warning。这是为什么?

文心的解释

在MySQL中,对于超出定义长度的VARCHAR字段进行插入操作时,行为可能会因为不同的SQL模式(SQL Modes)而有所不同。SQL模式定义了MySQL应该支持的SQL语法、数据验证以及如何处理错误等情况。

SQL模式差异:

严格模式(STRICT_TRANS_TABLES):当启用严格模式时,如果尝试插入的数据超出了字段定义的范围,MySQL会报错并拒绝执行该操作。
非严格模式:在不启用严格模式时,MySQL可能会接受超长的数据,但会截断数据到允许的最大长度,并生成一个警告(warning)而不是错误。

两个数据库可能配置了不同的SQL模式。一个数据库可能启用了严格模式,而另一个没有。

检查SQL模式:

要查看当前会话的SQL模式,可以使用以下SQL命令:SELECT @@sql_mode;
要查看全局SQL模式,可以使用:SELECT @@GLOBAL.sql_mode;

实践验证

库A:
SELECT @@sql_mode;返回 STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION。而SELECT @@GLOBAL.sql_mode;返回NO_ENGINE_SUBSTITUTION。

库B:
SELECT @@sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
SELECT @@GLOBAL.sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。

可以看到库A的全局级别SQL模式没有严格模式STRICT_TRANS_TABLES,而库B有。这可能就是原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值