当前位置: 首页 > article >正文

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有。这可能就是原因。


http://www.kler.cn/a/507543.html

相关文章:

  • 【北京迅为】iTOP-4412全能版使用手册-第七十六章 Qt界面切换
  • Kubernetes(k8s)和Docker Compose本质区别
  • 20.<Spring图书管理系统①(登录+添加图书)>
  • 6.3、OTN 保护
  • Linux 文件权限详解
  • Unity Dots理论学习-3.ECS有关的模块(2)
  • 【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-http版本(30 /100)
  • 阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI
  • matlab函数的主要目的是对包含在 Excel 电子表格中的实验数据进行模型拟合
  • 【k8s面试题2025】3、练气中期
  • 《机器学习》——SVD(奇异分解)降维
  • Go语言的编程范式
  • SpringBoot:RestTemplate与IllegalArgumentException
  • Springboot项目Jackson支持多种接收多种时间格式
  • C语言:-三子棋游戏代码:分支-循环-数组-函数集合
  • 如何利用CodeMeter保护您的物联网设备
  • XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展
  • 【CLIP-LIT】Iterative Prompt Learning for Unsupervised Backlit Image Enhancement
  • 今日总结 2025-01-17
  • 【HBuilderX 中 Git 的使用】