Я пытаюсь перенести таблицу пользователей в Laravel. Когда я запускаю миграцию, я получаю эту ошибку:
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа составляет 767 байт (SQL: изменить таблицу,
users
добавить уникальный users_email_uniq (
моя миграция выглядит следующим образом:
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('name', 32);
$table->string('username', 32);
$table->string('email', 320);
$table->string('password', 64);
$table->string('role', 32);
$table->string('confirmation_code');
$table->boolean('confirmed')->default(true);
$table->timestamps();
$table->unique('email', 'users_email_uniq');
});
После некоторого поиска в Google я наткнулся на этот отчет об ошибке, где Тейлор говорит, что вы можете указать ключ индекса как 2-й параметр unique()
, что я и сделал. Это все еще дает ошибку. Что здесь происходит?
Ответы:
Укажите меньшую длину для вашей электронной почты:
Что по умолчанию, на самом деле:
И тебе должно быть хорошо.
Для Laravel 5.4 вы можете найти решение в этом Laravel 5.4: Указанный ключ был слишком длинной ошибкой, Laravel News post:
Как указано в руководстве по миграции, чтобы исправить это, все, что вам нужно сделать, это отредактировать файл AppServiceProvider.php и в методе загрузки установить длину строки по умолчанию:
источник
254
вероятно, стоит иметь в виду, поэтому я бы, вероятно, проверил уникальность, используя валидатор в этом случае.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
правильный путь ссылки на функциюОбновление 1
Начиная с Laravel 5.4, эти изменения больше не нужны.
Обновление 2
Текущие производственные версии MariaDB НЕ поддерживают эту настройку по умолчанию во всем мире. Он реализован в MariaDB 10.2.2+ по умолчанию .
Решение
И если вы намеренно хотите использовать правильную многобайтовую
utf8mb4
поддержку UTF8 для будущих значений по умолчанию (начиная с Laravel 5.4), то начните исправлять конфигурацию базы данных.В Laravel
config/database.php
определяют:DYNAMIC
позволяет хранить длинные ключевые индексы.Настройки сервера (по умолчанию включены в MySQL 5.7.7+ / MariaDB 10.2.2+):
Для клиентов:
А затем ОСТАНОВИТЕ свой сервер MySQL / MariaDB. После этого СТАРТ. Горячая перезагрузка может не работать.
Теперь у вас есть Laravel 5.x с поддержкой UTF8.
источник
database.php
конфигурационном файле, и это повлияет на локальный проект Laravel. Обязательно внеситеdelete
базу данных перед внесением изменений и создайте ее с новыми настройками. Вам необходимо изменитьmy.cnf
конфигурационный файл только для глобальных изменений на стороне сервера (в настоящее время используются все новые установкиutf8mb4
).options={"row_format"="DYNAMIC"}
к@Table
аннотации.Если вы работаете с Laravel 5.4 или обновились до него, это сработало для меня;
Всего 1 смена. в AppServiceProvider.php
Как упоминалось в руководстве по миграции, https://laravel.com/docs/master/migrations#creating-indexes
источник
Если кто-то еще наткнется на этот ответ, как я, но по другой причине, вы можете проверить кодировку / сопоставление Laravel DB.
Я устанавливал приложение (Snipe-IT) и настроил конфигурацию базы данных Laravel для использования следующего:
Удаление
mb4
из обеих строк решило проблему, хотя я считаю, что ответ Антонио - реальное решение проблемы.источник
Это сработало для меня:
источник
Удалите mb4 из charset и параметры сортировки из config / database.php, тогда он будет успешно выполнен.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
источник
Для Laravel 5.6
Это решение решить мою проблему
перейдите к
config/database.php
Найти код ниже
Изменить это два поля
С этим
источник
Я столкнулся с той же проблемой и исправил ее, добавив две строки ниже в мой app / database.php
Мой файл выглядит следующим образом:
источник
Для laravel 5.4 просто отредактируйте файл
источник
источник
У меня была такая же проблема, и я использую Wamp
Решение: Откройте файл: config / database.php
Спасибо
источник
В файле config / database.php, где:
Измените эту строку на эту:
источник
Для Laravel> = 5.6 пользователей
Открыть
AppServiceProvider.php
файлИспользуйте следующий класс
Затем внутри
boot
метода добавьте следующую строкуисточник
Я добавил к самой миграции
да, я знаю, что мне нужно учитывать это при каждой миграции, но я бы предпочел, чтобы это было скрыто у какого-то совершенно не связанного поставщика услуг
источник
Если у кого-то возникла эта проблема даже после выполнения вышеуказанных изменений. Для примера, в моем случае я сделал ниже изменения,
Но это не сработает сразу по двум причинам. Во-первых, если вы используете lumen вместо laravel, вам, возможно, придется сначала раскомментировать эту строку в файле app.php.
А затем вам нужно снова создать сценарий миграции с помощью команды ремесленника,
Поскольку теперь будут работать только те изменения, которые вы внесли в ServiceProvider.
источник
для laravel 5.7 напишите этот код в appserviceprovider.php
источник
Измените кодировку с utf8mb4 на utf8 и
сопоставление 'utf8mb4_unicode_ci' с 'utf8_unicode_ci'
в файле config / database.php
Это сработало для меня.
источник
Laravel использует
utf8mb4
набор символов по умолчанию, который включает в себя поддержку хранения «emojis» в базе данных. Если вы используете версию MySQL, более раннюю, чем версия 5.7.7, или MariaDB, более раннюю, чем версия 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, генерируемую миграциями, чтобы MySQL создавал для них индексы. Вы можете настроить это, вызвавSchema::defaultStringLength
метод в вашемAppServiceProvider
:Вы можете проверить из
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
источник
Это потому, что Laravel 5.4 использует utf8mb4, который поддерживает хранение эмодзи.
Добавьте это в ваше приложение \ Providers \ AppServiceProvider.php
и тебе должно быть хорошо идти.
источник
Если вы используете или обновили Laravel 5.4 и последнюю версию, это работает;
Всего 1 изменение в AppServiceProvider.php
источник
Я хотел бы указать на то, что я пропустил ...
Я новичок в Laravel, и я не копировал «использовать Illuminate .....», потому что я действительно не уделил этому внимание, потому что прямо над загрузкой функции, которую вы уже прочитали, есть оператор использования .
Надеюсь, это поможет кому-нибудь
источник
\
У меня возникла проблема, измените конфигурацию «config / database»
сохраняя тот же шаблон в базе данных.
Затем я дал команду
источник
24 октября 2016 года Тейлор Отвелл, автор Laravel, объявил в твиттере
который до версии 5.4 набор символов был
utf8
В течение этого столетия многие веб-приложения включали чат или какую-то платформу, позволяющую пользователям общаться, и многим людям нравится использовать смайлики или смайлики. и это своего рода супер-символы, которые требуют больше места для хранения, и это возможно только при использовании
utf8mb4
в качестве кодировки . Это причина, почему они мигрируютutf8mb4
только для космических целей.если вы посмотрите вверх в
Illuminate\Database\Schema\Builder
классе, то увидите, что для$defaultStringLength
него установлено значение 255 , и для его изменения вы можете пройти черезSchema
Фасад, вызватьdefaultStringLength
метод и передать новую длину.чтобы выполнить это изменение, вызовите этот метод в вашем
AppServiceProvider
классе, который находится в подкаталоге app \ provider, например:Я предложу использовать 191 в качестве значения только потому, что MySQL поддерживает 767 байтов, и потому
767 / 4
что это число байтов, которое получает каждый многобайтовый символ, который вы получите191
.Вы можете узнать больше здесь Ограничения набора символов utf8mb4 (4-байтовое кодирование Unicode UTF-8) для числа столбцов таблицы и размера строки
источник
191
магическое число.РЕШЕНИЕ:
Сначала измените defaultStringLength на 191 в app \ Providers \ AppServiceProvider.php :
Затем измените значения набора символов и параметров сортировки следующим образом в config \ database.php :
( ссылка, чтобы узнать о MariaDB charset )
источник
Перейдите к своему
config/database.php
и измените кодировку и сопоставление с utf8mb4 на utf8Моя проблема решена с помощью этого метода, удачи, чувак!
источник
У вас не будет этой проблемы, если вы используете MySQL 5.7.7+ или MariaDB 10.2.2+.
Чтобы обновить MariaDB на вашем Mac с помощью Brew, сначала отсоедините текущую версию,
brew unlink mariadb
а затем установите dev, используяbrew install mariadb --devel
После завершения установки остановите / запустите службу:
brew services stop mariadb brew services start mariadb
Текущая версия - 10.2.3. После завершения установки вам больше не придется беспокоиться об этом, и вы можете использовать utf8mb4 (который теперь используется по умолчанию в Laravel 5.4), не переключаясь обратно на utf8 и не редактируя AppServiceProvider, как предлагается в документации Laravel: https: // laravel .com / docs / master / release # laravel-5.4 (прокрутите вниз до: Длина строки миграции по умолчанию )
источник
Только что установил MariaDB 10.2.4 RC, запустил новый пустой проект Laravel 5.4 и работает миграция по умолчанию (столбцы varchar (255)).
Не нужно менять БД conf и Laravael
config/database.php
. Таким образом, так же, как @scorer отметил поведение по умолчанию для 10.2.2+.источник
Все было хорошо описано в других Anwser, более подробную информацию вы можете увидеть в ссылке ниже (поиск по ключу «Длина индекса и MySQL / MariaDB») https://laravel.com/docs/5.5/migrations
НО ХОРОШО, ЭТО НЕ О ЧЕМ ЭТО ОТВЕТ дело даже в том, что, выполнив вышесказанное, вы захотите получить еще одну ошибку (вот когда вам нравится
php artisan migrate
команда запуска и из-за проблемы длины, операция, как застрявшая посередине. решение ниже , и пользовательская таблица, как создается без остальное или не совсем правильно) нам нужно накатить бак к. откат по умолчанию не подойдет. потому что операция по миграции не понравилась закончить. Вам необходимо удалить новые созданные таблицы в базе данных вручную.мы можем сделать это с помощью повозки, как показано ниже:
У меня самого была проблема с таблицей пользователей.
после этого ты можешь идти
источник
Установить движок базы данных InnoDB:
источник
Если вы попробовали все остальные ответы, но они не сработали, вы можете удалить все таблицы из базы данных, а затем сразу выполнить команду migrate, используя эту команду:
источник