【发布时间】:2012-11-28 10:24:34
【问题描述】:
当 MySQL 允许我将 NULL 插入到使用 NOT NULL 创建的字段中时,我感到非常惊讶。我做了一些研究,发现了如何启用严格模式。但是,我不太确定启用 STRICT_ALL_TABLES 时 MySQL 会做什么验证。
手册说:
严格模式控制 MySQL 如何处理无效或丢失的输入值。 一个值可能因多种原因无效。(强调我的)例如,它可能具有错误的列数据类型,或者它可能超出范围。
我了解它认为缺少什么以及如何处理它。我不清楚它认为什么是无效。我做了一些测试并发现了以下内容:
- 过长的字符串无效
- 超出范围的数字无效
-
非
NULL列的NULLs 无效 -
TRUE和FALSE似乎总是有效的(它们分别变成 1 和 0) - 无效日期无效
- 零日期有效(可以启用其他模式来更改此行为)
- 整数字段中的浮点数有效(四舍五入)
- 数字字段中的字母无效
除了上述之外,MySQL 是否进行任何其他验证检查?
手册说“列的数据类型错误”,但我看到的唯一实际发挥作用的情况是数字字段中的字母。还有其他数据类型错误的例子吗?
是否有一份关于 MySQL 执行的检查的列表?
编辑: 作为记录,我的应用程序已经进行了广泛的验证。我使用严格模式作为最后的机会,以防万一。如果我忘记检查某些内容,我希望它快速失败,而不是“默默地破坏我的数据”。
【问题讨论】:
-
我感觉您希望数据库为您进行数据验证。如果是这样的话,那就不好走下去了。
-
@siride:DBMS is 在那里进行验证(外键、主键、检查约束、类型验证)。 MySQL 允许您存储
February, 31st的事实在我看来是一个错误。或者换句话说:如果 DBMS 不做任何验证,这是一条非常糟糕的路。 -
我已经在应用程序中进行了验证。我不使用严格模式作为良好编程的替代,而是确保良好编程的一种方式.
-
刚刚看到你的最新评论。听起来不错。不过,我会在此处留下我的评论,以供将来查看仅 Db 验证解决方案的人使用。
-
天哪。一个高质量的研究问题。
标签: mysql validation strict