当MySQL允许我将NULL
插入到使用NOT NULL
创建的字段中时,我非常惊讶。我做了一些研究,并发现如何启用严格模式。但是,我不太确定当启用STRICT_ALL_TABLES
时MySQL做了什么验证。严格模式启用时,MySQL会做什么验证?
手册上说:
严格控制模式的MySQL如何处理是无效或丢失的输入值。 由于以下原因,值可能无效。(强调我的)例如,它可能有错误的数据类型的列,或者它可能超出范围。
我明白它认为丢失了什么以及如何处理它。我不清楚它认为无效。我做了一些测试,发现以下几点:
- 字符串太长无效
- 数字,超出范围是无效的
NULL
■对于非NULL
列无效TRUE
和FALSE
似乎总是有效(它们分别成为1和0)- 无效日期是无效的
- 零日期是有效的(ADDIT有理模式启用后可改变这种行为)
- 漂浮在整场是有效的(他们得到圆)在许多领域
- 信件是无效
用MySQL做得比其他任何其他验证检查上面提到了什么?
该手册说'列的数据类型错误',但唯一的情况是我看到这个实际进入的地方是数字字段中的字母。还有其他数据类型错误的例子吗?
是否有一个列表正确地检查MySQL的性能?
编辑:为了记录,我的应用程序已经做了广泛的验证。我使用严格模式作为最后机会,即时检查。如果我忘记检查某些内容,我希望它快速失败而不是'默默地修改我的数据'。
给我的感觉你想要DB为你做数据验证。如果是这样的话,这是一个不好的道路。 – siride
@siride:DBMS ***是***在那里做验证(外键,主键,检查约束,类型验证)。 MySQL允许你存储'February,31st'这个事实在我看来是一个错误。或者换句话说:如果DBMS没有做任何验证,那么这是一条非常糟糕的路。 –
我已经在应用程序中进行了验证。我*不*使用严格模式作为*替代品*以获得良好的编程,而是作为确保编程良好的一种方法。 – toxalot