为什么mysql对非可空字段接受null

时间:2015-12-13 21:43:33

标签: php mysql laravel laravel-5 laravel-5.1

我正在学习laravel 5.1到laracast fundamentals series,在第7集中讨论迁移,我建立了一个像这样的迁移表:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('body');
        $table->timestamps();
        $table->timestamp('published_at');
    });
}

正如它在第10集中所说的那样,当我通过一个没有published_at时间戳字段的表单向数据库添加文章时,这应该不起作用,应该通过例外Not Null constraint failed但令人难以置信的是,该文章已添加到​​表格中。 当我在phpmyadmin结构中查看published_at列的表时,它没有检查null复选框,所以它不应该接受null? 这是真的吗?
但后来我注意到迁移为0000-00-00 00:00:00列设置了published_at的默认值。 为什么?!会覆盖NULL条件吗? 然后我尝试将默认值设置为none,但仍未检查空值。我再次尝试添加一篇没有published_at字段的文章但又添加了一个新行,其中published_at值设置为0000-00-00 00:00:00。 任何解释?

我正在使用wampserver与mysql v5.6.17php v5.5.12

2 个答案:

答案 0 :(得分:3)

所有数据库类型都有默认值。当您创建记录并仅填充标题时,body将设置为空字符串,时间戳为“空”日期恰好是0000-00-00 00:00:00。如果您将这些字段设为可为空并为它们设置->default(null),则在这种情况下,它们将具有空值。

您还可以阅读Default values for types in MySql

答案 1 :(得分:1)

fswatch -r [lib test]

如果您没有看到其中一个Strict SQL Modes已启用,那么MySQL正在使用其较旧的行为,并将无效值强制转换为有效的值以允许插入行。

  

如果严格模式没有生效,MySQL会为无效值或缺失值插入调整后的值并产生警告。

官方MySQL Server 5.6附带的默认配置文件已启用SELECT @@SQL_MODE;。 WAMP可能没有遵循相同的约定,可能是出于向后兼容的原因......但是配置可以更改。