SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误

Posted

技术标签:

【中文标题】SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误【英文标题】:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax in while doing migration 【发布时间】:2020-05-01 21:24:49 【问题描述】:

当我跑步时

php artisan migrate

以下是我的架构


    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::table('pages', function (Blueprint $table) 
            $table->string('url')->unique()->after('id');
            $table->string('type')->after('meta_data');
            $table->json('meta_data')->change();
            $table->unsignedInteger('status_id')->default(3)->after('type');
            $table->boolean('is_active')->default(false)->after('status_id');

            $table->engine = 'InnoDB';

            // Foreign Key
            $table->foreign('status_id')
                ->references('id')->on('statuses')
                ->onDelete('cascade');
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::table('pages', function (Blueprint $table) 
            $table->dropColumn('is_active');
            $table->dropColumn('status_id');
            $table->dropColumn('type');
            $table->dropColumn('url');
        );
    


显示以下错误

Illuminate\Database\QueryException : SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“CHARACTER SET utf8mb4 NOT NULL”附近使用正确的语法(SQL:ALTER TABLE pages CHANGE meta_data meta_data JSON CHARACTER SET utf8mb4 NOT NULL)

【问题讨论】:

metadata 列已添加到areas 表中? 不,没有添加。 部分Previous 版本的mySQL 无法在JSON 中定义字段,因此您可以将其更改为LongText$table->longText('metadata')->nullable(); 我正在使用mySQL 版本` 5.7.26` 但我想以json 格式保存数据 @AbhishekPakhare 如果你在 longText 中定义字段,你也可以将 json 值存储到它,我以前用过这个。 【参考方案1】:
Schema::table('pages', function (Blueprint $table) 
            $table->string('url')->unique()->after('id');
            $table->string('type')->after('meta_data');
            $table->longText('meta_data')->change(); //changed to longText
            $table->unsignedInteger('status_id')->default(3)->after('type');
            $table->boolean('is_active')->default(false)->after('status_id');

            $table->engine = 'InnoDB';

            // Foreign Key
            $table->foreign('status_id')
                ->references('id')->on('statuses')
                ->onDelete('cascade');
        );

在这种情况下,您可以将 json 值存储到 metadata 字段只需在控制器中执行此操作 在您的控制器中存储前----> json_encode($metadata_variable); 当你想阅读或使用这个 ------> json_decode($metadata);

我用过这个,它工作正常

【讨论】:

我正在以Json 格式将数据存储在数据库中,并希望将数据类型保持为JSON。你知道如何以那种格式存储数据吗? 在你的字段中存储数据之前,通过json_encode将其转换为JSON,当你想阅读它时json_decode它,它会恢复到以前的状态。

以上是关于SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Cakephp SQLSTATE [42000]:语法错误或访问冲突:1064

带有消息“SQLSTATE [42000]”的未捕获异常“PDOException”:语法错误或访问冲突:

SQLSTATE [42000]:语法错误或访问冲突:1064 PHP/MySQL [关闭]

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误