简体   繁体   English

Laravel 迁移 SQLSTATE[42000]:语法错误或访问冲突:1064

[英]Laravel Migration SQLSTATE[42000]: Syntax error or access violation: 1064

I'm getting a new migration error for a very old migration (used to run fine).我收到了一个非常旧的迁移(以前运行良好)的新迁移错误。

The error i'm getting is: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`' at line 1 (SQL: ALTER TABLE rooms CHANGE conversion conversion TINYINT(1) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`)我得到的错误是: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`' at line 1 (SQL: ALTER TABLE rooms CHANGE conversion conversion TINYINT(1) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`' at line 1 (SQL: ALTER TABLE rooms CHANGE conversion conversion TINYINT(1) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`)

The migration file looks like this:迁移文件如下所示:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeRoomsConversionToBoolean extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('rooms', function (Blueprint $table) {
            $table->boolean('conversion')->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('rooms', function (Blueprint $table) {
            $table->string('conversion')->change();
        });
    }
}

If I run the query directly in the database ALTER TABLE rooms CHANGE conversion conversion TINYINT(1) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci` I get the error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL' at line 1如果我直接在数据库中运行查询ALTER TABLE rooms CHANGE conversion conversion TINYINT(1) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`我得到错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL' at line 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8 NOT NULL' at line 1

Im running on Homestead with Laravel 5.6.我使用 Laravel 5.6 在 Homestead 上运行。

Any help would be appreciated.任何帮助,将不胜感激。

I believe there are some issues with how Laravel is configuring DBAL ;我相信Laravel 如何配置 DBAL存在一些问题 however, I think the following will resolve your issue:但是,我认为以下将解决您的问题:

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('rooms', function (Blueprint $table) {
            $table->boolean('conversion')->charset(null)->collation(null)->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('rooms', function (Blueprint $table) {
            $table->string('conversion')->change();
        });
    }

I'm basing this answer off of looking at the source code for framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php .我的这个答案基于查看framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php的源代码。 You can see here, in your instance you do not want the specify a Character Set or collation for bigint.您可以在此处看到,在您的实例中,您不希望为 bigint 指定字符集或排序规则。 In order to skip these two options I think the only solution is to set those two values to null manually.为了跳过这两个选项,我认为唯一的解决方案是手动将这两个值设置为 null。 Here is the source code where that section of the MySQL query is formed: 是形成 MySQL 查询部分的源代码

    /**
     * Append the character set specifications to a command.
     *
     * @param  string  $sql
     * @param  \Illuminate\Database\Connection  $connection
     * @param  \Illuminate\Database\Schema\Blueprint  $blueprint
     * @return string
     */
    protected function compileCreateEncoding($sql, Connection $connection, Blueprint $blueprint)
    {
        // First we will set the character set if one has been set on either the create
        // blueprint itself or on the root configuration for the connection that the
        // table is being created on. We will add these to the create table query.
        if (isset($blueprint->charset)) {
            $sql .= ' default character set '.$blueprint->charset;
        } elseif (! is_null($charset = $connection->getConfig('charset'))) {
            $sql .= ' default character set '.$charset;
        }

        // Next we will add the collation to the create table statement if one has been
        // added to either this create table blueprint or the configuration for this
        // connection that the query is targeting. We'll add it to this SQL query.
        if (isset($blueprint->collation)) {
            $sql .= " collate '{$blueprint->collation}'";
        } elseif (! is_null($collation = $connection->getConfig('collation'))) {
            $sql .= " collate '{$collation}'";
        }

        return $sql;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Laravel - SQLSTATE [42000]:语法错误或访问冲突:迁移时为1064 - Laravel - SQLSTATE[42000]: Syntax error or access violation: 1064 on migration 错误Laravel框架:SQLSTATE [42000]:语法错误或访问冲突:1064 - Error Laravel Framework: SQLSTATE[42000]: Syntax error or access violation: 1064 SQLSTATE [42000]:语法错误或访问冲突:1064 laravel - SQLSTATE[42000]: Syntax error or access violation: 1064 laravel SQLSTATE [42000]:语法错误或访问冲突:laravel 中的 1064 - SQLSTATE[42000]: Syntax error or access violation: 1064 in laravel SQLSTATE [42000]:语法错误或访问冲突:1064? - SQLSTATE[42000]: Syntax error or access violation: 1064? SQLSTATE [42000]:语法错误或访问冲突:1064 - SQLSTATE[42000]: Syntax error or access violation: 1064 SQLSTATE [42000]:语法错误或访问冲突:1064 - SQLSTATE[42000]: Syntax error or access violation: 1064 Laravel:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误; - Laravel: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; Laravel SQLSTATE [42000]:语法错误或访问冲突 - Laravel SQLSTATE[42000]: Syntax error or access violation Laravel 5.8 SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误 - Laravel 5.8 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM