MySql错误:1364字段'display_name'没有默认值

Ben*_*son 47 php mysql

我刚刚从MAMP安装切换到本机Apache,MySql和PHP安装.我已经完成了所有工作,但我已经开始在新环境中使用我的Web应用程序,突然任何INSERT命令都会导致以下错误:

SQLSTATE [HY000]:常规错误:1364字段'display_name'没有默认值

看来我现在无法将领域留空.我使用的是MySql 5.6.13版

有没有办法在MySql中更改此设置?

小智 132

MySQL最有可能处于STRICT模式.

尝试运行SET GLOBAL sql_mode=''或编辑my.cnf以确保您没有设置STRICT_ALL_TABLES等.

  • 在MySQL中使用严格模式是不好的做法? (8认同)

cal*_*nai 17

MySQL最有可能处于STRICT模式状态,这不一定是坏事,因为你会尽早识别错误/问题,而不是盲目地认为一切都按预期工作.

将列更改为允许null:

ALTER TABLE `x` CHANGE `display_name` `display_name` TEXT NULL
Run Code Online (Sandbox Code Playgroud)

或者,将其作为空字符串赋予默认值:

ALTER TABLE `x` CHANGE `display_name` `display_name` TEXT NOT NULL DEFAULT ''
Run Code Online (Sandbox Code Playgroud)

  • 这导致"...... TEXT列不能具有默认值". (3认同)
  • 这是一个更好的解决方案.作为开发人员,您不应该依赖延迟编码.确切地知道您在数据库中的内容.严格模式对开发人员来说是一个很大的好处,因为它有助于识别草率代码. (2认同)

小智 9

所有这些答案都是一个很好的方法,但我认为您不想总是转到您的数据库并修改您设置为NULL的默认值.我建议你去app/User.php并修改受保护的$ fillable,这样它就会把你新的字段用在用于注册的数据数组中.假设你添加一个名为"first_name"的新输入字段,你的$ fillable应该是这样的:protected $ fillable = ['first_name','email','password',]; 这样做对我来说.祝好运!

  • 你为什么假设 OP 使用 laravel/eloquent? (3认同)

Nim*_*ani 5

我也遇到了这个问题,在laravel中有两种解决方法。

  1. 第一个是可以将默认值设置为null。我会给你看一个例子:

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('gender');
            $table->string('slug');
            $table->string('pic')->nullable();
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    
    Run Code Online (Sandbox Code Playgroud)

如上例所示,您可以nullable()为该功能进行设置。然后在插入数据MySQL时将默认值设置为null。

  1. 第二个是在模型中在protected $fillable字段中设置输入字段。例如:

    protected $fillable = [
        'name', 'email', 'password', 'slug', 'gender','pic'
    ];
    
    Run Code Online (Sandbox Code Playgroud)

我认为第二个比第一个还好,并且您可以同时设置可为空的功能和可填充的功能,而不会出现问题。