php artisan make:auth
を含むLaravel 5.4の移行エラー
[Illuminate\Database\QueryException] SQLSTATE [42000]:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです(SQL:テーブルの変更
users
ユニークなusers_email_unique
([PDOException] SQLSTATE [42000]:構文エラーまたはアクセス違反:1071指定されたキーが長すぎます。最大キー長は767バイトです
公式ドキュメント によると、これは非常に簡単に解決できます。
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
上記の解決策と公式の解決策が追加されている理由はわかりません
Schema::defaultStringLength(191);
AppServiceProvider
で私のために働いていませんでした。うまくいったのはconfig
フォルダのdatabase.php
ファイルを編集することでした。編集するだけ
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
に
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
そしてそれはうまくいくはずです。それが役に立てば幸い。
私はこの答えをquickest
解決策としてここに追加しています。デフォルトのデータベースエンジンを'InnoDB'
onに設定するだけです。
/config/database.php
'mysql' => [
...,
...,
'engine' => 'InnoDB',
]
それからphp artisan config:cache
を実行して設定キャッシュをクリアしてリフレッシュ
AppServiceProvider.php
では、ファイルの先頭にこのコードを含めます。
use Illuminate\Support\Facades\Schema;
そしてこのコードをブートメソッドに追加します。
Schema::defaultStringLength(191);
この問題は、データベースのバージョンによって、Laravel 5.4で発生します。
docs (Index 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
オプションを有効にすることもできます。このオプションを正しく有効にする方法については、データベースのマニュアルを参照してください。
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();
php artisan migrate
コマンドを使用しているときにlaravelで作業中にこのエラーが発生した場合は、ファイルに2行追加するだけです。app-> Providers-> AppServiceProvider.php
use Schema;
Schema::defaultStringLength(191);
この画像 を確認してください。それからphp artisan migrate
コマンドを再度実行してください。
この問題を解決し、config-> database.phpファイルを私のデータベースのように編集しました ( 'charset' => 'utf8') および ( 'collation' => '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,
],
以下のコードを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
コマンドを実行します。
長さの制限を設定する代わりに、私は私のために働いてきた以下を提案するでしょう。
内部
config/database.php
この行をmysqlに置き換えます
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
upon
'engine' => null,
私は私のために働く2つの{ sollution } _を加えています。
1回目の溶解は :
'engine' => null,
を'engine' => 'InnoDB',
に編集します
これは私のために働きました。
2回目の溶解度は:
database.php file insde config dir /フォルダを開きます。
2.編集 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
に
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Goodluck
既に指定したように、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
AppServiceProvider.php fileに:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
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:cache
laravelを再設定します
3- データベース内の既存のテーブルを削除してからphp artisan migrate
をもう一度実行します。
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();
});
}
これを修正するために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
その後はすべて正常に動作するはずです。
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のエントリを削除する必要があります。
Laravel 5.4がデフォルトのデータベース文字セットをutf8mb4に変更したため、これは一般的です。あなたがしなければならないのは、次のとおりです。クラス宣言の前にこのコードを入れて、App\Providers.phpを編集します。
use Illuminate\Support\Facades\Schema;
また、これを 'boot'関数に追加しますSchema::defaultStringLength(191);
users
とpassword_resets
migrationファイルの次の行を変更したところです。
古い:$table->string('email')->unique();
新機能:$table->string('email', 128)->unique();
ほら!!
これを修正するための移行ガイドで説明されているように、AppServiceProvider.phpファイルを編集し、ブートメソッド内でデフォルトの文字列長を設定するだけです。
//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
これがお役に立てば幸いです。
これらの行を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のこれらの変更はあなたを助けるでしょう
データベースにデータがまだ割り当てられていない場合は、次の手順を実行します。
illuminate\Support\ServiceProviderを使用してください。
そしてメソッドboot()の中。
Schema :: defaultStringLength(191);
今すぐあなたのデータベースのレコードを削除してください。
以下を実行
php職人の設定:キャッシュ
php職人の移行
推奨される解決策は、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'
それが役に立てば幸い!
コード内の何も変更しないようにする 、単純に MySQLサーバーを少なくとも5.7.7に更新する
詳細についてはこれを参照してください: https://laravel-news.com/laravel-5-4-key-too-long-error
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:utf8mb4をcharset:utf8に変更
今、私の教義の移行は再びうまくいっています。
ここでの作業は、キー名を含む2番目のパラメータ(短いもの)を渡すことでした。
$table->string('my_field_name')->unique(null,'key_name');
これに遭遇するかもしれない他の誰かにとって、私の問題は私がstring
型の列を作り、それが整数になるように意図した時にそれを->unsigned()
にしようとしているということでした。
最初にローカルホストのデータベースのすべてのテーブルを削除します
ファイルconfig/database.phpのLaravelデフォルトデータベース(utf8mb4)プロパティを次のように変更します。
「charset」=>「utf8」、「照合」=>「utf8_unicode_ci」、
その後、ローカルデータベースプロパティutf8_unicode_ciを変更します。 PHPアーティザンの移行は問題ありません。
ローカルデータベースサーバのタイプを "mariadb" から "mysql" に変更すると、Laravelファイルを編集しなくてもこれが修正されました。
私は私のdbサーバーの種類を変更するためにこのチュートリアルに従った: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html
私の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に設定すると、私の問題は解決しました。
次のように、インデックス付きフィールドの文字列の長さを設定できます。
$table->string('email', 200)->unique();
ルーメンの場合:
.env
ファイルに追加
DB_ENGINE=InnoDB