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

Php Laravel迁移SQLSTATE[42000]:语法错误或访问冲突:1064,php,mysql,laravel,laravel-5.6,Php,Mysql,Laravel,Laravel 5.6,对于一个非常旧的迁移(过去运行正常),我遇到了一个新的迁移错误 我得到的错误是:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行使用“字符集utf8 NOT NULL COLLATE`utf8\U unicode\U ci`”附近的正确语法(SQL:ALTER TABLE ROOMES CHANGE conversion TINYINT(1)字符集utf8 NOT NULL COLLATE`utf8\U u

对于一个非常旧的迁移(过去运行正常),我遇到了一个新的迁移错误

我得到的错误是:
SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行使用“字符集utf8 NOT NULL COLLATE`utf8\U unicode\U ci`”附近的正确语法(SQL:ALTER TABLE ROOMES CHANGE conversion TINYINT(1)字符集utf8 NOT NULL COLLATE`utf8\U unicode\U ci`)

迁移文件如下所示:

<?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();
        });
    }
}
我相信有一些;但是,我认为以下几点可以解决您的问题:

/**
*运行迁移。
*
*@返回无效
*/
公共职能
{
模式::表('rooms',函数(Blueprint$表){
$table->boolean('conversion')->charset(null)->排序规则(null)->change();
});
}
/**
*反向迁移。
*
*@返回无效
*/
公共职能部门
{
模式::表('rooms',函数(Blueprint$表){
$table->string('conversion')->change();
});
}
我的回答是基于查看
framework/src/illumb/Database/Schema/Grammars/MySqlGrammar.php
的源代码。您可以在这里看到,在您的实例中,您不希望为bigint指定字符集或排序规则。为了跳过这两个选项,我认为唯一的解决方案是手动将这两个值设置为null。MySQL查询的这一部分是在哪里形成的:

/**
*将字符集规范附加到命令。
*
*@param string$sql
*@param\light\Database\Connection$Connection
*@param\light\Database\Schema\Blueprint$Blueprint
*@返回字符串
*/
受保护的函数compileCreateEncoding($sql,Connection$Connection,Blueprint$Blueprint)
{
//首先,我们将设置角色集(如果已在创建
//blueprint本身或在根配置上为
//正在上创建表。我们将这些表添加到“创建表”查询中。
if(isset($blueprint->charset)){
$sql.=“默认字符集”。$blueprint->charset;
}elseif(!is_null($charset=$connection->getConfig('charset')){
$sql.=“默认字符集”。$charset;
}
//接下来,我们将向CREATETABLE语句中添加排序规则(如果已添加排序规则)
//已添加到此创建表蓝图或此的配置中
//查询所针对的连接。我们将其添加到此SQL查询中。
如果(isset($blueprint->collation)){
$sql.=“整理'{$blueprint->collation}'”;
}elseif(!is_null($collation=$connection->getConfig('collation')){
$sql.=“collate'{$collate}'”;
}
返回$sql;
}
我相信有一些;但是,我认为以下几点可以解决您的问题:

/**
*运行迁移。
*
*@返回无效
*/
公共职能
{
模式::表('rooms',函数(Blueprint$表){
$table->boolean('conversion')->charset(null)->排序规则(null)->change();
});
}
/**
*反向迁移。
*
*@返回无效
*/
公共职能部门
{
模式::表('rooms',函数(Blueprint$表){
$table->string('conversion')->change();
});
}
我的回答是基于查看
framework/src/illumb/Database/Schema/Grammars/MySqlGrammar.php
的源代码。您可以在这里看到,在您的实例中,您不希望为bigint指定字符集或排序规则。为了跳过这两个选项,我认为唯一的解决方案是手动将这两个值设置为null。MySQL查询的这一部分是在哪里形成的:

/**
*将字符集规范附加到命令。
*
*@param string$sql
*@param\light\Database\Connection$Connection
*@param\light\Database\Schema\Blueprint$Blueprint
*@返回字符串
*/
受保护的函数compileCreateEncoding($sql,Connection$Connection,Blueprint$Blueprint)
{
//首先,我们将设置角色集(如果已在创建
//blueprint本身或在根配置上为
//正在上创建表。我们将这些表添加到“创建表”查询中。
if(isset($blueprint->charset)){
$sql.=“默认字符集”。$blueprint->charset;
}elseif(!is_null($charset=$connection->getConfig('charset')){
$sql.=“默认字符集”。$charset;
}
//接下来,我们将向CREATETABLE语句中添加排序规则(如果已添加排序规则)
//已添加到此创建表蓝图或此的配置中
//查询所针对的连接。我们将其添加到此SQL查询中。
如果(isset($blueprint->collation)){
$sql.=“整理'{$blueprint->collation}'”;
}elseif(!is_null($collation=$connection->getConfig('collation')){
$sql.=“collate'{$collate}'”;
}
返回$sql;
}