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

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.lryc.cn/news/522789.html

相关文章:

  • Flink 使用 Kafka 作为数据源时遇到了偏移量提交失败的问题
  • 【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析
  • LSA更新、撤销
  • DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
  • centos 7 Mysql服务
  • React 表单处理与网络请求封装详解[特殊字符][特殊字符]
  • C++ 的 CTAD 与推断指示(Deduction Guides)
  • 【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注
  • 如何将原来使用cmakelist编译的qt工程转换为可使用Visual Studio编译的项目
  • 微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜
  • Ubuntu、Windows系统网络设置(ping通内外网)
  • 华为OD机试E卷 ---最大值
  • UllnnovationHub,一个开源的WPF控件库
  • Fabric区块链网络搭建:保姆级图文详解
  • Kubernetes (K8s) 权限管理指南
  • IM聊天学习资源
  • 计算机视觉模型的未来:视觉语言模型
  • 【JAVA 基础 第(19)课】Hashtable 类用法和注意细节,是Map接口的实现类
  • 浅谈 JVM
  • html的iframe页面给帆软BI发送消息
  • spark任务优化参数整理
  • C++ 模拟真人鼠标轨迹算法 - 防止游戏检测
  • 生产环境中常用的设计模式
  • 基于SpringBoot+Vue的药品管理系统【源码+文档+部署讲解】
  • 【CompletableFuture实战】
  • Redis 缓存穿透、击穿、雪崩 的区别与解决方案
  • Python自动化测试中定位隐藏菜单元素的策略
  • 【张雪峰高考志愿填报】合集
  • 53,【3】BUUCTF WEB october 2019 Twice SQLinjection
  • 【Linux系统】分区挂载