Ошибка миграции на Laravel 5.4 с php artisan make:auth
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа составляет 767 байт (SQL: изменить таблицу,
users
добавить уникальныйusers_email_unique
([PDOException] SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа 767 байт
Ответы:
Согласно официальной документации , вы можете решить это довольно легко.
Добавьте следующие две строки кода в AppServiceProvider.php (/app/Providers/AppServiceProvider.php).
источник
Я не знаю, почему вышеупомянутое решение и официальное решение, которое добавляет
в
AppServiceProvider
меня не получилось. То, что работало для редактированияdatabase.php
файла вconfig
папке. Просто отредактируйтев
и это должно работать, хотя вы не сможете хранить расширенные многобайтовые символы, такие как эмодзи .
Я сделал это с Laravel 5.7. Надеюсь, поможет.
источник
use Illuminate\Support\Facades\Schema;
наверху.utf8mb4
Сличение есть по причине, я рекомендую использовать его , если вы можете.Я просто добавляю этот ответ здесь, поскольку это
quickest
решение для меня. Просто установите ядро базы данных по умолчанию'InnoDB'
на/config/database.php
затем запустите,
php artisan config:cache
чтобы очистить и обновить кеш конфигурацииисточник
В
AppServiceProvider.php
, включить этот код верхней части файла.источник
Эта проблема вызвана в Laravel 5.4 версией базы данных.
Согласно документации (в
Index Lengths & MySQL / MariaDB
разделе):Другими словами, в
<ROOT>/app/Providers/AppServiceProvider.php
:Но, как говорится в комментарии к другому ответу:
Таким образом, документация также предлагает другое решение:
источник
Для тех, кто не хочет меняться
AppServiceProvider.php
. (На мой взгляд, это плохая идея, чтобы изменитьAppServiceProvider.php
только для миграции)Вы можете добавить обратно длину данных в файл миграции,
database/migrations/
как показано ниже:create_users_table.php
create_password_resets_table.php
источник
Если вы столкнулись с этой ошибкой во время работы над laravel при использовании команды:
php artisan migrate
просто добавьте в файл 2 строки: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
пожалуйста, проверьте это изображение . затем
php artisan migrate
снова запустите команду.источник
\Schema::defaultStringLength(191);
Я добавляю два решения, которые работают для меня.
1-е растворение это :
Изменить
'engine' => null,
на'engine' => 'InnoDB',
Это сработало для меня.
2-е решение:
Откройте файл database.php insde config dir / folder.
2. Изменить
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
на
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Удачи
источник
обновите и вставьте эти строки в app / Providers / AppServiceProvider.php
источник
Я решил эту проблему и отредактировал файл config-> database.php так, чтобы он соответствовал моей базе данных ('charset' => 'utf8') и ('collation' => 'utf8_general_ci') , поэтому моя проблема решена как следовать:
источник
Я нашел два решения этой ошибки
ОПЦИЯ 1:
Откройте таблицу user и password_reset в папке database / migrations
И просто измените длину письма:
ВАРИАНТ 2:
Откройте ваш
app/Providers/AppServiceProvider.php
файл и внутриboot()
метода установите длину строки по умолчанию:источник
1- иди
/config/database.php
и найди эти строкии измените их на:
2- Беги,
php artisan config:cache
чтобы перенастроить Laravel3- Удалите существующие таблицы в вашей базе данных, а затем
php artisan migrate
снова запуститеисточник
В файле AppServiceProvider.php :
источник
Вместо того, чтобы устанавливать ограничение по длине, я бы предложил следующее, что сработало для меня.
Внутри:
замените эту строку для mysql:
с участием:
источник
Как указано в руководстве по миграции, чтобы исправить это, все, что вам нужно сделать, это отредактировать
app/Providers/AppServiceProvider.php
файл и в методе загрузки установить длину строки по умолчанию:Примечание: сначала вы должны удалить (если есть) таблицу пользователей, таблицу password_resets из базы данных и удалить записи пользователей и password_resets из таблицы миграции .
Чтобы выполнить все ваши выдающиеся миграции, выполните команду
migrate
Artisan:После этого все должно работать как обычно.
источник
Как уже было указано, мы добавляем AppServiceProvider.php в App / Providers.
Вы можете увидеть более подробную информацию в ссылке ниже (поиск "Длина индекса и MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
НО ХОРОШО, ЭТО не то, о чем я все опубликовал! дело даже в том, что при выполнении вышеизложенного вы, скорее всего, получите другую ошибку (когда вы запускаете
php artisan migrate
команду и из-за проблемы длины, операция, скорее всего, застрянет в середине. решение находится ниже , и, вероятно, создана пользовательская таблица). без всего остального или не совсем корректно) надо откатиться назад . откат по умолчанию не будет работать. потому что операция по миграции не понравилась закончить. Вам необходимо удалить новые созданные таблицы в базе данных вручную.мы можем сделать это используя тинкер, как показано ниже:
У меня самого была проблема с таблицей пользователей.
после этого ты можешь идти
php artisan migrate:rollback
php artisan migrate
источник
Решение, о котором никто не говорит, состоит в том, что в Mysql v5.5 и более поздних версиях InnoDB является механизмом хранения по умолчанию, у которого нет этой проблемы, но во многих случаях, как у меня, есть некоторые старые файлы конфигурации mysql ini, которые используют старый механизм хранения MYISAM, как показано ниже.
который создает все эти проблемы, и решение состоит в том, чтобы раз и навсегда изменить механизм хранения по умолчанию на InnoDB в файле конфигурации ini Mysql вместо временного взлома.
И если вы используете MySql v5.5 или новее, то InnoDB - это движок по умолчанию, поэтому вам не нужно устанавливать его явно, как описано выше, просто удалите его,
default-storage-engine=MYISAM
если он существует,ini
и все готово.источник
show global variables like 'innodb_large_prefix';
она должна быть включена . Если он выключен, вы можете проверить этот ответ о том, как его включить. А вот больше информации о innodb_large_prefix на dev.mysql.com.Если вы хотите изменить в AppServiceProvider, то вам нужно определить длину поля электронной почты при миграции. просто замените первую строку кода на вторую строку.
create_users_table
create_password_resets_table
После успешных изменений вы можете запустить миграцию.
Примечание: сначала необходимо удалить (если есть) пользователи таблицы , таблицы password_resets из базы данных и удаления пользователей и password_resets записей из таблицы миграции.
источник
Schema::defaultStringLength(191);
по умолчанию определит длину всех строк 191, что может испортить вашу базу данных. Вы не должны идти по этому пути.Просто определите длину любого конкретного столбца в классе миграции базы данных. Например, я определяю «имя», «имя пользователя» и «адрес электронной почты» в
CreateUsersTable
классе, как показано ниже:источник
Это часто встречается, поскольку Laravel 5.4 изменил установленный по умолчанию характер базы данных на utf8mb4. Что вы должны сделать, это: отредактируйте ваш App \ Providers.php, поместив этот код перед объявлением класса
Кроме того, добавьте это в функцию «загрузки»
Schema::defaultStringLength(191);
источник
Если у вас нет данных, уже назначенных вашей базе данных, сделайте следующее:
и внутри метода boot ();
Теперь удалите записи в вашей базе данных, например, пользовательскую таблицу.
запустить следующее
источник
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
уже есть. Надеюсь, вы исправите этоКак указано в руководстве по миграции, чтобы исправить это, все, что вам нужно сделать, это отредактировать файл AppServiceProvider.php и в методе загрузки установить длину строки по умолчанию:
Надеюсь, это поможет вам .. ура ..
источник
Я только что изменил следующую строку
users
иpassword_resets
файл миграции.Старый:
$table->string('email')->unique();
Новый:
$table->string('email', 128)->unique();
источник
Чтобы ничего не менять в вашем коде , просто обновите сервер MySQL как минимум до 5.7.7
Ссылка на это для получения дополнительной информации: https://laravel-news.com/laravel-5-4-key-too-long-error
источник
Я думаю, что заставить StringLenght на 191 действительно плохая идея. Поэтому я расследую, чтобы понять, что происходит.
Я заметил, что это сообщение об ошибке:
Начал появляться после того, как я обновил свою версию MySQL. Поэтому я проверил таблицы с помощью PHPMyAdmin и заметил, что все новые таблицы были созданы с сопоставлением utf8mb4_unicode_ci вместо utf8_unicode_ci для старых.
В моем конфигурационном файле doctrine я заметил, что charset был установлен в utf8mb4, но все мои предыдущие таблицы были созданы в utf8, поэтому я предполагаю, что это какая-то магия обновления, которая начинает работать на utf8mb4.
Теперь несложное решение - изменить линейный набор символов в вашем конфигурационном файле ORM. Затем удалите таблицы с помощью utf8mb4_unicode_ci, если вы находитесь в режиме разработки, или исправьте кодировку, если вы не можете их удалить.
Для Symfony 4
Теперь мои доктрины миграции снова работают хорошо.
источник
Рекомендуемое решение - включить
innodb_large_prefix
опцию MySQL, чтобы избежать последующих проблем. И вот как это сделать:Откройте
my.ini
файл конфигурации MySQL и добавьте ниже строки под[mysqld]
строкой, как это.После этого сохраните изменения и перезапустите службу MySQL.
Откат, если вам нужно, а затем повторно запустите миграцию.
На случай, если проблема не устранена, перейдите в файл конфигурации базы данных и установите
'engine' => null,
в'engine' => 'innodb row_format=dynamic'
Надеюсь, поможет!
источник
сначала удалите все таблицы базы данных на локальном хосте
Измените свойства базы данных Laravel по умолчанию (utf8mb4) в файле config / database.php на:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
после этого изменив свойства моей локальной базы данных utf8_unicode_ci. php artisan migrate это нормально.
источник
Для всех, кто мог столкнуться с этим, моя проблема заключалась в том, что я делал столбец типа
string
и пытался создать его,->unsigned()
когда хотел, чтобы он был целым числом.источник
Подходя к этой работе, здесь передают второй параметр с ключевым именем (коротким):
источник
Я получал эту ошибку, хотя у меня уже было (на самом деле, потому что у меня уже было) Schema :: defaultStringLength (191); в моем файле AppServiceProvider.php.
Причина в том, что я пытался установить строковое значение в одной из моих миграций на значение выше 191:
Удаление 1000 или установка 191 решило мою проблему.
источник