Ошибка миграции Laravel: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт
Ошибка миграции на Laravel 5.4 с php artisan make:auth
[Illuminate\Database\QueryException] SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт (SQL: alter tabl e
users
add uniqueusers_email_unique
([PDOException] SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт


Ответы - Ошибка миграции Laravel: синтаксическая ошибка или нарушение прав доступа: 1071 указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт / Laravel Migration Error: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

15.02.2017 12:52:58
Согласно официальной документации, вы можете решить эту проблему довольно легко.
Добавьте следующий код в AppServiceProvider.на PHP (/приложение/поставщики/AppServiceProvider.РНР)
use Illuminate\Support\Facades\Schema; //NEW: Import Schema
function boot()
{
Schema::defaultStringLength(191); //NEW: Increase StringLength
}
MySQL резервирует всегда максимальное количество для поля UTF8, которое составляет 4 байта, поэтому с 255 + 255 с вашим набором символов по умолчанию utf8mb4 COLLATE utf8mb4_unicode_ci; вы превышаете предел максимальной длины ключа 767. Автор @scaisedge













20.02.2017 10:39:20
Эта проблема вызвана в Laravel 5.4 версией базы данных.
Согласно документам (в разделе Index Lengths & MySQL / MariaDB
):
Laravel использует
utf8mb4
метод в вашемSchema::defaultStringLength
.
Другими словами, в AppServiceProvider
:
<ROOT>/app/Providers/AppServiceProvider.php
Но как говорится в комментарии к другому ответу:
Будьте осторожны с этим решением. Например, если вы индексируете поля электронной почты, сохраненные сообщения электронной почты могут иметь только максимальную длину 191 символов. Это меньше чем официальный RFC заявляет.
Таким образом, документация также предлагает другое решение:
Кроме того, вы можете включить опцию
innodb_large_prefix для вашего база данных. Инструкции см. В документации к базе данных как правильно включить эту опцию.

10.03.2017 07:02:04
В AppServiceProvider.php
, вы включаете этот код в начало файла.
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}


21.04.2017 07:46:22
Для тех, кто не хочет менять 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();




25.06.2017 11:03:06
Если вы хотите изменить в 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();
После успешного изменения вы можете запустить миграцию.
Примечание: сначала необходимо удалить (если есть) таблицу users, таблицу password_resets из базы данных и удалить записи users и password_resets из таблицы миграции.

24.07.2017 11:21:50
Вместо того, чтобы устанавливать ограничение на длину, я бы предложил следующее, что сработало для меня.
Внутри
конфигурация / база данных.РНР
замените эту строку для MySQL
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
на
'engine' => null,

17.09.2017 11:29:58
Я не знаю, почему вышеприведенное решение и официальное решение, которое добавляет
Schema::defaultStringLength(191);
в AppServiceProvider
не работает для меня.
То, что работало для редактирования database.php
-файл в config
к
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
и это должно сработать. Надеюсь, это поможет.



use Illuminate\Support\Facades\Schema;
в верхней части.


09.10.2017 10:50:30
Я просто добавляю этот ответ здесь, поскольку это самое quickest
решение для меня. Просто установите компонент database engine по умолчанию на 'InnoDB'
on
/config/database.php
'mysql' => [
...,
...,
'engine' => 'InnoDB',
]
затем запустите php artisan config:cache
, чтобы очистить и обновить кэш конфигурации








06.12.2017 06:43:28
Чтобы избежать изменения чего-либо в вашем коде, просто обновите ваш сервер MySQL по крайней мере до 5.7.7
Ссылка на это для получения дополнительной информации : https://laravel-news.com/laravel-5-4-key-too-long-error


17.01.2018 11:37:12
Как уже было указано, мы добавляем в 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
migrate, и из-за проблемы длины операция, скорее всего, застрянет в середине. решение приведено ниже , и пользовательская таблица, вероятно, создана без остатка или не совсем правильно)
нам нужно откатиться назад . откат по умолчанию не будет работать. потому что операция по миграции не понравилась финишу. вы должны удалить новые созданные таблицы в базе данных вручную.
мы можем сделать это с помощью 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

19.01.2018 08:43:59
Как описано в руководстве по миграции, чтобы исправить это, все, что вам нужно сделать, это отредактировать app/Providers/AppServiceProvider.php
файл и внутри метода загрузки установите длину строки по умолчанию:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Примечание: сначала вы должны удалить (если у вас есть) таблицу users, таблицу password_resets из базы данных и удалить записи users и password_resets из таблицы миграций.
Чтобы выполнить все ваши выдающиеся миграции, выполните команду migrate
Artisan:
php artisan migrate
После этого все должно работать как обычно.

08.02.2018 09:37:55
Я нашел два решения для этой ошибки
Вариант 1:
Откройте таблицу user и password_reset в папке database / migrations
И просто измените длину письма:
$table->string('email',191)->unique();
Вариант 2:
Откройте app/Providers/AppServiceProvider.php
-файл и внутри boot()
установите длину строки по умолчанию:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}

08.02.2018 01:44:39
Это распространено, так как Laravel 5.4 изменил стандартный набор символов базы данных на utf8mb4. Что вам нужно сделать, это: изменить приложение\провайдеры.в PHP, поставив этот код перед объявлением класса
use Illuminate\Support\Facades\Schema;
Кроме того, добавьте это в функцию загрузки
Schema::defaultStringLength(191);

20.04.2018 09:24:12
Я решил эту проблему и отредактировал мою конфигурацию - > база данных.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,
],

23.04.2018 12:08:24
Schema::defaultStringLength(191);
определит длину всех строк 191 по умолчанию, что может привести к разрушению вашей базы данных. Вы не должны идти этим путем.
Просто определите длину любого конкретного столбца в классе миграции базы данных. Например, я определяю "имя", "имя пользователя" и "адрес электронной почты" в CreateUsersTable


25.04.2018 10:20:40
Для всех, кто мог бы столкнуться с этим, моя проблема заключалась в том, что я делал столбец типа string
и пытался сделать его ->unsigned()
, когда я хотел, чтобы он был целым числом.

17.05.2018 12:03:54
Я думаю, что заставить 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
измените кодировку: utf8mb4 на кодировку: utf8 в config / packages / doctrine.и YAML
Теперь моя доктрина миграции снова работает просто отлично.


28.06.2018 04:33:26
Я добавляю два решения, которые работают для меня.
1-е решение :
- Откройте базу данных.в php файл внутри конфига каталог/папку.
Редактирование
'engine' => null,
для'engine' => 'InnoDB',
Это сработало для меня.
2-ое решение является:
Откройте базу данных.в php файл внутри конфига каталог/папку.
2.Править
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
к'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Гудлак

24.07.2018 04:23:31
Подход, который здесь работает, - это передать второй парам с именем ключа (короткий):
$table->string('my_field_name')->unique(null,'key_name');

28.09.2018 09:15:17
обновите и вставьте эти строки в app / Providers / AppServiceProvider.РНР
use Illuminate\Support\Facades\Schema; // add this line at top of file
public function boot()
{
Schema::defaultStringLength(191); // add this line in boot method
}

16.11.2018 09:34:27
Я только что изменил следующую строку в users
файле миграции users и password_resets.
Старый : password_resets
Новый : $table->string('email')->unique();

28.11.2018 10:59:53
Рекомендуемое решение-включить innodb_large_prefix
файл конфигурации MySQL и добавьте следующие строки под my.ini
, как это.
[mysqld]
После этого сохраните изменения и перезапустите службу MySQL.
Откат, если вам нужно, а затем повторно запустить миграцию.
На всякий случай, если ваша проблема все еще сохраняется, перейдите в файл конфигурации базы данных и установите
[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON
для 'engine' => null,
Надеюсь, это поможет!

17.01.2019 07:52:49
Если вы столкнулись с этой ошибкой при работе на laravel при использовании команды: php artisan migrate
затем вы просто добавляете 2 строки в файл: app - >Providers - > > AppServiceProvider.РНР
use Schema;
Schema::defaultStringLength(191);
пожалуйста, проверьте это изображение .
затем снова запустите команду php artisan migrate
migrate.


\Schema::defaultStringLength(191);

08.02.2019 11:10:38
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




07.03.2019 07:40:24
В AppServiceProvider.php-файл:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}

21.04.2019 04:41:40
Если у вас еще нет данных, назначенных для вашей базы данных, выполните следующие действия:
- Перейдите в приложение / провайдеры / AppServiceProvide.PHP и добавить
используйте Illuminate\Support\ServiceProvider;
и внутри метода загрузки();
Схема:: defaultStringLength(191);
Теперь удалите записи в своей базе данных, например, пользовательскую таблицу.
выполните следующие действия
php artisan config: кэш
в PHP ремесленника перенести

use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
это уже есть. Надеюсь, вы исправите это

02.05.2019 07:26:17
Я получал эту ошибку, хотя я уже имел (на самом деле, потому что я уже имел) Схема:: defaultStringLength(191); в моем AppServiceProvider.PHP-файл.
Причина в том, что я пытался установить строковое значение в одной из моих миграций на значение выше 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 решили мою проблему.

09.05.2019 07:16:29
Изменение типа сервера локальной базы данных с "mariadb" на "mysql" исправило это для меня без необходимости редактировать какие-либо файлы Laravel.
Я следовал этому руководству, чтобы изменить тип моего сервера БД: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html



07.07.2019 11:59:42
сначала удалите все таблицы базы данных в localhost
Измените свойства базы данных Laravel по умолчанию (utf8mb4)в файле config/database.PHP для:
'кодировка' => 'в кодировке utf8', 'сортировки' => 'utf8_unicode_ci',
после этого Изменение свойств локальной базы данных utf8_unicode_ci. в PHP ремесленника перенести все в порядке.

17.07.2019 08:13:31
Как описано в руководстве по миграции, чтобы исправить это все, что вам нужно сделать, это отредактировать свой AppServiceProvider.php файл и внутри метода загрузки установите длину строки по умолчанию:
//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Надеюсь, это поможет вам..овации..

08.11.2019 11:06:13
Решение, которое никто не говорит, заключается в том, что в Mysql v5. 5 и более поздних InnoDB является механизмом хранения по умолчанию, который не имеет этой проблемы, но во многих случаях, таких как мой, есть некоторые старые файлы конфигурации mysql ini, которые используют старый MYISAM
default-storage-engine=MYISAM
который создает все эти проблемы, и решение состоит в том, чтобы изменить default-storage-engine InnoDB в файле конфигурации ini Mysql один раз для всех вместо того, чтобы делать временные вещи.
default-storage-engine=InnoDB

16.11.2019 09:55:51
Всего несколько строк в файле /etc / mysql / mariadb.конф.d / 50-сервер.cnf или где бы ни была ваша конфигурация:
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
innodb_default_row_format = 'DYNAMIC'
и sudo service mysql restart
https://stackoverflow.com/a/57465235/778234
Смотрите документы: https://dev.mysql.com/doc/refman/5.6/en/innodb-row-format.html