我正在学习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.17
,php v5.5.12
答案 0 :(得分:3)
所有数据库类型都有默认值。当您创建记录并仅填充标题时,body将设置为空字符串,时间戳为“空”日期恰好是0000-00-00 00:00:00
。如果您将这些字段设为可为空并为它们设置->default(null)
,则在这种情况下,它们将具有空值。
答案 1 :(得分:1)
fswatch -r [lib test]
。
如果您没有看到其中一个Strict SQL Modes已启用,那么MySQL正在使用其较旧的行为,并将无效值强制转换为有效的值以允许插入行。
如果严格模式没有生效,MySQL会为无效值或缺失值插入调整后的值并产生警告。
官方MySQL Server 5.6附带的默认配置文件已启用SELECT @@SQL_MODE;
。 WAMP可能没有遵循相同的约定,可能是出于向后兼容的原因......但是配置可以更改。