Laravel 迁移 SQLSTATE[42000]:语法错误或访问冲突:1064
Laravel Migration SQLSTATE[42000]: Syntax error or access violation: 1064
我收到一个非常旧的迁移的新迁移错误(以前 运行 没问题)。
我得到的错误是: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`)
迁移文件如下所示:
<?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();
});
}
}
如果我运行直接在数据库中查询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
我 运行 和 Laravel 5.6 一起在 Homestead。
如有任何帮助,我们将不胜感激。
我相信有一些issues with how Laravel is configuring DBAL;但是,我认为以下内容可以解决您的问题:
/**
* 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();
});
}
我的回答基于查看 framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php
的源代码。您可以在此处看到,在您的实例中,您不希望为 bigint 指定字符集或排序规则。为了跳过这两个选项,我认为唯一的解决方案是手动将这两个值设置为空。 Here is the source code 形成 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;
}
我收到一个非常旧的迁移的新迁移错误(以前 运行 没问题)。
我得到的错误是: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`)
迁移文件如下所示:
<?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();
});
}
}
如果我运行直接在数据库中查询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
我 运行 和 Laravel 5.6 一起在 Homestead。
如有任何帮助,我们将不胜感激。
我相信有一些issues with how Laravel is configuring DBAL;但是,我认为以下内容可以解决您的问题:
/**
* 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();
});
}
我的回答基于查看 framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php
的源代码。您可以在此处看到,在您的实例中,您不希望为 bigint 指定字符集或排序规则。为了跳过这两个选项,我认为唯一的解决方案是手动将这两个值设置为空。 Here is the source code 形成 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;
}