Ошибка миграции Laravel: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт
ошибка миграции на Laravel 5.4 с php artisan make:auth
[IlluminateDatabaseQueryException] SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт (SQL: alter tabl e
users
добавить уникальныйusers_email_unique
([PDOException] SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт
21 ответ:
этот вопрос решается следующим образом.
добавьте следующий код в AppServiceProvider.php
L5_root/app/Providers/AppServiceProvider.php
код блока
use Illuminate\Support\Facades\Schema; //Import Schema function boot() { Schema::defaultStringLength(191); //Solved by increasing StringLength }
MySQL всегда резервирует максимальную сумму для поля UTF8, которое составляет 4 байта, поэтому с 255 + 255 с вашим набором символов по умолчанию utf8mb4 COLLATE utf8mb4_unicode_ci; вы находитесь за пределом максимальной длины ключа 767. By @scaisedge
Я не знаю, почему выше решение и официальное решение, которое добавляет
Schema::defaultStringLength(191);
на
AppServiceProvider
не работает для меня. То, что работало для редактирования наconfig
папка. Просто редактировать'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
до
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
и это должно сработать. Надеюсь, это поможет.
на
AppServiceProvider.php
, вы включаете этот код в верхней части файла.use Illuminate\Support\Facades\Schema;
и добавить этот код в метод загрузки.
Schema::defaultStringLength(191);
эта проблема вызвана в Laravel 5.4 версией базы данных.
по словам docs (в ):
Laravel использует
utf8mb4
кодировка по умолчанию, который включает в себя поддержка хранения "emojis" в базе данных. Если вы работаете версия MySQL старше выпуска 5.7.7 или MariaDB старше выпуск 10.2.2, возможно, потребуется вручную настроить по умолчанию длина строки, порожденные миграцией для того, чтобы MySQL создать индексы для них. Вы можете настроить это, вызвавSchema::defaultStringLength
метод в пределахAppServiceProvider
.другими словами, в
<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); } // ... }
но как говорится в комментарии к другому ответу:
будьте осторожны с этим решением. Если вы индексируете поля электронной почты, например, сохраненные электронные письма могут иметь только максимальную длину 191 символов. Это меньше чем утверждает официальный РФС.
так документация также предлагает другое решение:
кроме того, вы можете включить для вашего база данных. Инструкции по использованию см. В документации к базе данных как правильно включить эту опцию.
Я просто добавляю этот ответ здесь, как это самое быстрое решение для меня. Просто установите для компонента database engine по умолчанию значение
'InnoDB'
on
/config/database.php
выполнить'mysql' => [ ..., ..., 'engine' => 'InnoDB', ]
php artisan config:cache
для очистки и обновления кэша конфигурации
для тех, кто не хочет менять AppServiceProvider.РНР. (На мой взгляд, это плохая идея, чтобы изменить AppServiceProvider.php только для migrateion)
вы можете добавить обратно длину данных в файл миграции в разделе 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-файл как базу данных ('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, ],
вместо того, чтобы устанавливать ограничение на длину, я бы предложил следующее, что сработало для меня.
внутри
конфигурация / база данных.php
замените эту строку для MySQL
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
на
'engine' => null,
как уже указано, мы добавляем в AppServiceProvider.php в приложении / провайдеры
use Illuminate\Support\Facades\Schema; // add this /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // also this line }
вы можете увидеть более подробную информацию в ссылке ниже (Поиск " Index Lengths & MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
но это не то, что я опубликовал все о! дело даже при выполнении выше вы, вероятно, получите еще одну ошибку (вот когда вы бежите
php artisan migrate
команды и из-за проблема длины, операция, скорее всего, застрял в середине. Решение ниже, и пользовательская таблица, скорее всего, создана без остатка или не совсем правильно) нам нужно откатиться. откат по умолчанию не будет работать. потому что операция по миграции не понравилась finish. необходимо удалить новые созданные таблицы в базе данных вручную.мы можем сделать это с помощью tinker, как показано ниже:
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
как указано в миграции руководство чтобы исправить это, все, что вам нужно сделать, это изменить свой
app/Providers/AppServiceProvider.php
file и внутри метода загрузки установите длину строки по умолчанию:use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
Примечание: сначала вы должны удалить (если есть) пользователи стол, password_resets таблица из базы данных и удалить пользователей и password_resets записи из миграция таблица.
чтобы запустить все ваши выдающиеся миграции, выполнить
migrate
команда ремесленник:php artisan migrate
после этого все должно работать нормально.
Schema::defaultStringLength(191);
определим длину всех строк 191 по умолчанию, которые могут разрушить вашу базу. Вы не должны идти этим путем.просто определите длину любого конкретного столбца в классе миграции базы данных. Например, я определяю "имя", "имя пользователя" и "электронная почта" в
CreateUsersTable
класс, как показано ниже: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(); }); }
Если вы хотите изменить в AppServiceProvider, то вам нужно определить длину поля электронной почты в миграции. просто замените первую строку кода на вторую строку.
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();
после успешного изменения вы можете запустить миграцию.
Примечание: сначала вы должны удалить (если есть) таблица пользователей,password_resets стол из базы данных и удалить пользователей и password_resets записи из таблицы миграции.
это распространено с тех пор, как Laravel 5.4 изменил значение по умолчанию charater базы данных на utf8mb4. Что вам нужно сделать, это: редактировать приложение\провайдеры.php, поставив этот код перед объявлением класса
use Illuminate\Support\Facades\Schema;
кроме того, добавьте это в функцию " boot
Schema::defaultStringLength(191);
Как указано в миграции руководство чтобы исправить это все, что вам нужно сделать, это изменить приложение/провайдеры/AppServiceProvider.php-файл и внутри метода загрузки установите длину строки по умолчанию:
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
сначала вы должны удалить (если есть) таблица пользователей, password_resets таблица из базы данных и удалить пользователей и password_resets записи из миграция таблица.
для запуска всех ваших выдающиеся миграции, выполните команду migrate Artisan:
php artisan migrate
для того чтобы ничего не меняя в коде, просто обновите свой сервер MySQL по крайней мере до 5.7.7
ссылка на это для получения дополнительной информации:https://laravel-news.com/laravel-5-4-key-too-long-error
для всех, кто может столкнуться с этим, моя проблема заключалась в том, что я делал столбец типа
string
и пытается сделать это->unsigned()
когда я хотел, чтобы это было целое число.
Я думаю, что заставить StringLenght до 191-это действительно плохая идея. Поэтому я исследую, чтобы понять, что происходит.
Я заметил, что это сообщение об ошибке :
SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком долго; максимальная длина ключа составляет 767 байт
начал появляться после того, как я обновил свою версию MySQL. Поэтому я проверил таблицы с помощью PHPMyAdmin, и я заметил, что все новые созданные таблицы были с помощью сопоставление utf8mb4_unicode_ci вместо utf8_unicode_ci для старых.
в моем файле конфигурации доктрины я заметил, что charset был установлен в utf8mb4, но все мои предыдущие таблицы были созданы в utf8, поэтому я думаю, что это какая-то магия обновления, которая начинает работать на utf8mb4.
теперь легко исправить, чтобы изменить кодировку строки в вашем файле конфигурации ORM. Затем, чтобы удалить таблицы с помощью utf8mb4_unicode_ci, если вы находитесь в режиме dev или исправить кодировку если ты не можешь их бросить.
Для Symfony 4
изменить charset: utf8mb4 до charset: utf8 in config / packages / doctrine.и YAML
теперь моя доктрина миграции снова работает просто отлично.
Я добавляю два sollution эта работа для меня.
- открыть
подошел к тому, что работа здесь была передана второй парам с именем ключа (короткий):
$table->string('my_field_name')->unique(null,'key_name');
для меня то, что работало, было обновить зависимости, запустив.
composer update
вы также должны установить последнюю версию mysql.
обновить и вставить эти строки в app / Providers / AppServiceProvider.php
use Illuminate\Support\Facades\Schema; //insert this line public function boot() { Schema::defaultStringLength(191); //insert this line also }
установите компонент database engine в config / database.php в массиве 'mysql'
'engine' => 'InnoDB',