web-dev-qa-db-ja.com

Laravel 移行エラー:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです

php artisan make:authを含むLaravel 5.4の移行エラー

[Illuminate\Database\QueryException] SQLSTATE [42000]:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです(SQL:テーブルの変更usersユニークなusers_email_uniqueemail))。

[PDOException] SQLSTATE [42000]:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです

95
absiddiqueLive

公式ドキュメント によると、これは非常に簡単に解決できます。

AppServiceProvider.phpに次のコードを追加します (/app/Providers/AppServiceProvider.php)

use Illuminate\Support\Facades\Schema; //NEW: Import Schema

function boot()
{
    Schema::defaultStringLength(191); //NEW: Increase StringLength
}

MySQLは常にUTF8フィールドの最大量を4バイトに確保します。つまり、255 + 255ではデフォルトの文字セットutf8mb4 COLLATEとなります。 767の最大キー長制限を超えています。投稿者@scaisedge

152
absiddiqueLive

上記の解決策と公式の解決策が追加されている理由はわかりません

Schema::defaultStringLength(191);

AppServiceProviderで私のために働いていませんでした。うまくいったのはconfigフォルダのdatabase.phpファイルを編集することでした。編集するだけ

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

そしてそれはうまくいくはずです。それが役に立てば幸い。

67
Koushik Das

私はこの答えをquickest解決策としてここに追加しています。デフォルトのデータベースエンジンを'InnoDB'onに設定するだけです。

/config/database.php

'mysql' => [
    ...,
    ...,
    'engine' => 'InnoDB',
 ]

それからphp artisan config:cacheを実行して設定キャッシュをクリアしてリフレッシュ

43
Dexter Bengil

AppServiceProvider.phpでは、ファイルの先頭にこのコードを含めます。

use Illuminate\Support\Facades\Schema;

そしてこのコードをブートメソッドに追加します。

 Schema::defaultStringLength(191);
22
user7688086

この問題は、データベースのバージョンによって、Laravel 5.4で発生します。

docsIndex Lengths & MySQL / MariaDBセクションにあります)によると、

Laravelはデフォルトでutf8mb4文字セットを使用します。これはデータベースに "emojis"を格納するためのサポートを含みます。バージョン5.7.7より前のMySQLまたはバージョン10.2.2より前のMariaDBを実行している場合は、MySQLでインデックスを作成するために、移行によって生成されるデフォルトの文字列長を手動で設定する必要があります。 AppServiceProviderの中でSchema::defaultStringLengthメソッドを呼び出すことでこれを設定できます。

言い換えれば、<ROOT>/app/Providers/AppServiceProvider.phpで:

// Import Schema
use Illuminate\Support\Facades\Schema;
// ...

class AppServiceProvider extends ServiceProvider
{

public function boot()
{
    // Add the following line
    Schema::defaultStringLength(191);
}

// ...

}

しかし、他の答えへのコメントが言うように:

この解決策には注意してください。たとえば、Eメールフィールドにインデックスを付けると、保存されたEメールの最大長は191文字です。これは公式のRFCの規定よりも少ないです。

そのため、ドキュメントでは別の解決策も提案されています。

あるいは、データベースに対してinnodb_large_prefixオプションを有効にすることもできます。このオプションを正しく有効にする方法については、データベースのマニュアルを参照してください。

17
Esteban Herrera

AppServiceProvider.phpを変更したくないという人のために。 (私の意見では、マイグレーションのためだけにAppServiceProvider.phpを変更するのは悪い考えです)

以下のようにdatabase/migrations/の下のマイグレーションファイルにデータ長を戻すことができます。

create_users_table.php

$table->string('name',64);
$table->string('email',128)->unique();

create_password_resets_table.php

$table->string('email',128)->index();
13
helloroy

php artisan migrateコマンドを使用しているときにlaravelで作業中にこのエラーが発生した場合は、ファイルに2行追加するだけです。app-> Providers-> AppServiceProvider.php

  1. use Schema;
  2. Schema::defaultStringLength(191);

この画像 を確認してください。それからphp artisan migrateコマンドを再度実行してください。

9
Abdul Rasheed

この問題を解決し、config-> database.phpファイルを私のデータベースのように編集しました ( 'charset' => 'utf8') および ( 'collat​​ion' => 'utf8_general_ci') だから私の問題は以下のようにコードを解決する:

'mysql' => [
        'driver' => 'mysql',
        'Host' => env('DB_Host', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
6
Ahmad Shakib

以下のコードをapp/Providers/AppServiceProvider.phpメソッドに追加します。

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

最初にデータベースから usersテーブル password_resets tableを削除し、 migrations テーブルからusersとpassword_resetsのエントリを削除し、次に古いテーブルを削除した後にphp artisan migrateコマンドを実行します。

6
Udhav Sarvaiya

長さの制限を設定する代わりに、私は私のために働いてきた以下を提案するでしょう。

内部

config/database.php

この行をmysqlに置き換えます

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

upon

'engine' => null,

私は私のために働く2つの{ sollution } _を加えています。

1回目の溶解は

  1. database.php file insde config dir /フォルダを開きます。
  2. 'engine' => null,'engine' => 'InnoDB',に編集します

    これは私のために働きました。

2回目の溶解度は:

  1. database.php file insde config dir /フォルダを開きます。
    2.編集
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',

    'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',


Goodluck

5
Arslan Ahmad

既に指定したように、App/ProvidersのAppServiceProvider.phpに追加します

use Illuminate\Support\Facades\Schema;  // add this

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); // also this line
}

以下のリンクで詳細を確認できます(「インデックスの長さとMySQL/MariaDB」を検索) https://laravel.com/docs/5.5/migrations

しかし、それは私がすべてについて公開したものではありません!上記のことを行っても問題はあります別のエラーphp artisan migrateコマンドを実行するときで、長さの問題のため、操作はおそらく途中で停止します。ソリューション以下であり、ユーザーテーブルは残りなしで作成されるか、完全に正しくない可能性があります)ロールバックする必要があります 。デフォルトのロールバックは機能しません。移行の操作が終了を好まなかったからです。データベースに新しく作成されたテーブルを手動で削除する必要があります。

以下のようにティンカーを使用してそれを行うことができます:

L:\todos> php artisan tinker

Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman

>>> Schema::drop('users')

=> null

私自身、ユーザーテーブルに問題がありました。

その後、あなたは行ってもいいです

php artisan migrate:rollback

php artisan migrate

4
Mohamed Allal

AppServiceProvider.php fileに:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
3
Indian_ontop

1 - /config/database.phpに移動して、次の行を見つけます。

'mysql' => [
    ...,
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    ...,
    'engine' => null,
 ]

そしてそれらを次のように変更します。

'mysql' => [
    ...,
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    ...,
    'engine' => 'InnoDB',
 ]

2- /を実行してphp artisan config:cachelaravelを再設定します

3- データベース内の既存のテーブルを削除してからphp artisan migrateをもう一度実行します。

3

Schema::defaultStringLength(191);はデフォルトで全ての文字列の長さを定義します191、これはあなたのデータベースを破壊するかもしれません。あなたはこのようにしてはいけません。

データベース移行クラスの特定の列の長さを定義するだけです。例えば、私は以下のようにCreateUsersTableクラスの "name"、 "username"、 "email"を定義しています。

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 191);
            $table->string('username', 30)->unique();
            $table->string('email', 191)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
3

これを修正するためにMigrations guide で概説されているように、あなたがしなければならないのはあなたのapp/Providers/AppServiceProvider.phpファイルを編集することだけで、ブートメソッドの中でデフォルトの文字列長を設定する:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

注:最初にデータベースからusersテーブル、password_resetsテーブルを削除し、migrationsテーブルからusersとpassword_resetsのエントリを削除する必要があります。

未解決の移行をすべて実行するには、migrate Artisanコマンドを実行します。

php artisan migrate

その後はすべて正常に動作するはずです。

3
user9162235

AppServiceProviderで変更したい場合は、移行時にEメールフィールドの長さを定義する必要があります。コードの最初の行を2行目に置き換えるだけです。

create_users_table

$table->string('email')->unique();
$table->string('email', 50)->unique();

create_password_resets_table

$table->string('email')->index();
$table->string('email', 50)->index();

変更が成功したら、移行を実行できます。
注:最初にデータベースから usersテーブル password_resetsテーブル を削除し、マイグレーションテーブルからusersとpassword_resetsのエントリを削除する必要があります。

3

Laravel 5.4がデフォルトのデータベース文字セットをutf8mb4に変更したため、これは一般的です。あなたがしなければならないのは、次のとおりです。クラス宣言の前にこのコードを入れて、App\Providers.phpを編集します。

use Illuminate\Support\Facades\Schema;

また、これを 'boot'関数に追加しますSchema::defaultStringLength(191);

2
Treasure

userspassword_resetsmigrationファイルの次の行を変更したところです。

古い:$table->string('email')->unique();

新機能:$table->string('email', 128)->unique();

ほら!!

2
Mahesh Gaikwad

これを修正するための移行ガイドで説明されているように、AppServiceProvider.phpファイルを編集し、ブートメソッド内でデフォルトの文字列長を設定するだけです。

//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

これがお役に立てば幸いです。

2
Rohit Saini

これらの行をapp/Providers/AppServiceProvider.phpで更新して挿入します。

use Illuminate\Support\Facades\Schema;  //insert this line
public function boot()
{
    Schema::defaultStringLength(191); //insert this line also
}

app/Serviceprovider.phpのこれらの変更はあなたを助けるでしょう

2
Anjani Barnwal

データベースにデータがまだ割り当てられていない場合は、次の手順を実行します。

  1. App/Providers/AppServiceProvide.phpに移動して追加します。

illuminate\Support\ServiceProviderを使用してください。

そしてメソッドboot()の中。

Schema :: defaultStringLength(191);

  1. 今すぐあなたのデータベースのレコードを削除してください。

  2. 以下を実行

php職人の設定:キャッシュ

php職人の移行

2
Levinski Polish

推奨される解決策は、MySQLのinnodb_large_prefixオプションを有効にすることです。そうすれば、その後の問題に巻き込まれることはありません。そして、その方法は次のとおりです。

MySQLの設定ファイルmy.iniを開き、このように[mysqld]行の下に以下の行を追加します。

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

その後、変更を保存してMySQLサービスを再起動します。

必要に応じてロールバックしてから、移行を再実行します。


問題が解決しない場合に備えて、データベース設定ファイルに移動して設定してください。

'engine' => null,から'engine' => 'innodb row_format=dynamic'

それが役に立てば幸い!

1
Sammie

コード内の何も変更しないようにする 、単純に MySQLサーバーを少なくとも5.7.7に更新する

詳細についてはこれを参照してください: https://laravel-news.com/laravel-5-4-key-too-long-error

1
F.E Noel Nfebe

StringLenghtを191に強制することは本当に悪い考えです。だから私は何が起こっているのか理解するために調査します。

私はこのメッセージエラーに気づきました:

SQLSTATE [42000]:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです

MySQLのバージョンを更新した後に現れ始めました。そのため、PHPMyAdminでテーブルをチェックしたところ、作成されたすべての新しいテーブルが古いテーブルのutf8_unicode_ciではなくutf8mb4_unicode_ciという照合順序で作成されていました。

私の教義の設定ファイルで、私はcharsetがutf8mb4に設定されていることに気づきました、しかし私の以前のテーブルはすべてutf8で作成されたので、私はこれがutf8mb4で動作するようになるアップデートマジックだと思います。

今すぐ簡単な解決策はあなたのORMの設定ファイルの行の文字セットを変更することです。次に、devモードにある場合はutf8mb4_unicode_ciを使用してテーブルを削除し、削除できない場合は文字セットを修正します。

Symfony 4のために

config/packages/doctrine.yaml charset:utf8mb4charset:utf8に変更

今、私の教義の移行は再びうまくいっています。

1
Kaizoku Gambare

ここでの作業は、キー名を含む2番目のパラメータ(短いもの)を渡すことでした。

$table->string('my_field_name')->unique(null,'key_name');
0
Tiago Gouvêa

これに遭遇するかもしれない他の誰かにとって、私の問題は私がstring型の列を作り、それが整数になるように意図した時にそれを->unsigned()にしようとしているということでした。

0
Brynn Bateman

最初にローカルホストのデータベースのすべてのテーブルを削除します

ファイルconfig/database.phpのLaravelデフォルトデータベース(utf8mb4)プロパティを次のように変更します。

「charset」=>「utf8」、「照合」=>「utf8_unicode_ci」、

その後、ローカルデータベースプロパティutf8_unicode_ciを変更します。 PHPアーティザンの移行は問題ありません。

0

ローカルデータベースサーバのタイプを "mariadb" から "mysql" に変更すると、Laravelファイルを編集しなくてもこれが修正されました。

私は私のdbサーバーの種類を変更するためにこのチュートリアルに従った: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html

0
Adam Winster

私のAppServiceProvider.phpファイルにSchema :: defaultStringLength(191);がすでに(実際にはすでに私はすでに)含まれているので)あっても、このエラーが発生していました。

その理由は、マイグレーションの1つでストリング値を191より高い値に設定しようとしていたためです。

Schema::create('order_items', function (Blueprint $table) {
    $table->primary(['order_id', 'product_id', 'attributes']);
    $table->unsignedBigInteger('order_id');
    $table->unsignedBigInteger('product_id');
    $table->string('attributes', 1000); // This line right here
    $table->timestamps();
});

1000を削除するか191に設定すると、私の問題は解決しました。

0
Jacey

次のように、インデックス付きフィールドの文字列の長さを設定できます。

  $table->string('email', 200)->unique();
0
Smith

ルーメンの場合:

.envファイルに追加

DB_ENGINE=InnoDB
0
Scotty G