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

tox*_*lot 21 mysql validation strict

当MySQL允许我插入一个NULL用它创建的字段时,我感到非常惊讶NOT NULL.我做了一些研究,发现了如何启用严格模式.但是,我不太清楚MySQL STRICT_ALL_TABLES启用时的验证.

手册说:

严格模式控制MySQL处理无效或缺失的输入值的方式.由于多种原因,值可能无效.(强调我的)例如,它可能具有错误的数据类型,或者它可能超出范围.

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

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

除了上面提到的以外,MySQL是否会进行任何其他验证检查?

手册中说"列的数据类型错误",但我发现实际发挥作用的唯一情况是数字字段中的字母.是否有其他数据类型错误的例子?

是否有一个列表确切地检查MySQL执行的是什么?

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

Bil*_*win 8

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

您进行了出色的研究和测试,但还有一些案例,例如:

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

此外mysql-test/include/strict_autoinc.inc,因为当auto-inc值变得太大时,它会测试溢出.

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