首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当启用严格模式时,MySQL会做什么验证?

问当启用严格模式时,MySQL会做什么验证?
EN

Stack Overflow用户
提问于 2012-12-10 22:41:52
回答 2查看 3.3K关注 0票数 22

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

手册上写着:

严格模式控制MySQL如何处理无效或缺失的输入值。A值可能由于以下几个原因而无效。例如,(强调雷)可能对列具有错误的数据类型,或者它可能超出了范围。

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

  • 太长的字符串无效。
  • 超出范围的数字无效。
  • 非NULL列的NULLs无效。
  • TRUE和FALSE似乎总是有效的(它们分别变成1和0)
  • 无效日期无效
  • 零日期是有效的(可以启用其他模式来更改此行为)
  • 整数字段中的浮点数是有效的(它们被舍入)
  • 数字字段中的字母无效

除了上面提到的以外,MySQL还有其他的验证检查吗?

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

在某个地方是否有MySQL执行的检查的列表?

编辑:为记录,我的应用程序已经做了广泛的验证。我用严格的方式作为最后的机会,以防万一。如果我忘记检查某件东西,我希望它快速失效,而不是“悄悄地损坏我的数据”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-12 17:38:00

一个好的资源是检查MySQL源代码,并阅读mysql-test/t/strict.test来查看他们在设置严格模式或传统模式(这是一个超集的严格模式)之后测试的所有情况。

您做了很好的研究和测试,但是还有几个案例,例如:

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

此外,mysql-test/include/strict_autoinc.inc,因为它测试溢出时,汽车公司的价值增长太大。

还有一些其他测试文件对特定的测试使用严格的模式,但我没有检查它们。

票数 9
EN

Stack Overflow用户

发布于 2012-12-12 18:49:17

我查看了MySQL 5.5.28 (Community )的源代码,以查找正在使用的STRICT_ALL_TABLES实例。

据我所见,您的列表看起来已经很完整了,但是下面是我了解到的关于STRICT_ALL_TABLES使用的更多内容。第一个是另一个验证,其余的都处理错误和警告。

  • 几何图形列不能有默认值。(sql/field.cc:9394)
  • 如果表注释大于2048个字符,则MySQL将产生错误,而不是用警告截断注释。(sql/unireg.cc:231)
  • 如果字段注释大于1024个字符,则MySQL将产生错误,而不是用警告截断注释。(sql/unireg.cc:739)
  • 在插入或更新时,如果集合或MySQL中存在重复值,则会产生错误而不是警告。(sql/sql_table.cc:2503)
  • 有许多操作将在使用STRICT_ALL_TABLES发出警告时中止,而不只是进行警告。这些内容太多,我无法列出,而且abort_on_warning标志的设置与创建警告的代码相去甚远,这些警告可以方便地记录(甚至理解)所有这些警告。但是,如果有人想在源代码中弄脏他们的手,那么有几个地方可以从sql/sql_update.cc:630和sql/sql_insert.cc:841开始
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13810562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档