gpt4 book ai didi

mysql - 启用严格模式时 MySQL 会进行哪些验证?

转载 作者:IT老高 更新时间:2023-10-28 23:50:03 25 4
gpt4 key购买 nike

当 MySQL 允许我将 NULL 插入使用 NOT NULL 创建的字段时,我感到非常惊讶。我做了一些研究,发现了如何启用严格模式。但是,我不太确定启用 STRICT_ALL_TABLES 时 MySQL 会做什么验证。

手册说:

Strict mode controls how MySQL handles input values that are invalid or missing. A value can be invalid for several reasons. (emphasis mine) For example, it might have the wrong data type for the column, or it might be out of range.

我了解它认为缺少什么以及如何处理它。我不清楚它认为什么是无效。我做了一些测试并发现了以下内容:

  • 过长的字符串无效
  • 超出范围的数字无效
  • NULL列的NULL无效
  • TRUEFALSE 似乎总是有效的(它们分别变为 1 和 0)
  • 无效日期无效
  • 零日期有效(可以启用其他模式来更改此行为)
  • 整数字段中的 float 有效(四舍五入)
  • 数字字段中的字母无效

除了上述之外,MySQL 是否进行任何其他验证检查?

手册上说“列的数据类型错误”,但我看到的唯一实际发挥作用的情况是数字字段中的字母。还有其他数据类型错误的例子吗?

是否有一份关于 MySQL 执行的检查的列表?

编辑: 作为记录,我的应用程序已经进行了广泛的验证。我使用严格模式作为最后的机会,以防万一。如果我忘记检查某些内容,我希望它快速失败,而不是“默默地破坏我的数据”。

最佳答案

一个很好的资源是检查 MySQL 源代码,并阅读 mysql-test/t/strict.test 以查看在设置 STRICT 模式或 TRADITIONAL 模式(这是一个严格的超集)。

你做了很好的研究和测试,但是还有一些案例,比如:

  • 尝试插入未定义的 ENUM 值。
  • 尝试为未定义 DEFAULT 的 NOT NULL 列插入默认值。
  • 尝试使用 CAST() 将字符串转换为整数等。
  • 如果您提供的长度大于 65536,则将 VARCHAR 转换为 MEDIUMTEXT 或 LONGTEXT。
  • 截断表和列的 COMMENT 字符串。
  • 将字符串转换为 YEAR 类型。
  • 定义具有重复条目的 SET 或 ENUM 列。

还有 mysql-test/include/strict_autoinc.inc,因为它会在 auto-inc 值变得太大时测试溢出。

还有一些其他测试文件使用 STRICT 模式进行特定测试,但我没有检查它们。

关于mysql - 启用严格模式时 MySQL 会进行哪些验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com