Я пытаюсь перенести таблицу пользователей в Laravel. Когда я запускаю миграцию, я получаю эту ошибку:
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт (пользователи SQL: alter table добавляют уникальные 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'); });
по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'); });
После некоторого googling я наткнулся на этот отчет об ошибке, где Тейлор говорит, что вы можете указать индексный ключ как второй параметр unique()
, который я сделал. Он все еще дает ошибку. Что здесь происходит?
Укажите меньшую длину для вашего электронного письма:
$table->string('email', 250);
Фактически это значение по умолчанию:
$table->string('email');
И ты должен быть хорошим.
Для Laravel 5.4 вы можете найти решение в этом Laravel 5.4: Указанный ключ был слишком длинной ошибкой, сообщение Laravel News :
Как указано в руководстве по миграции, чтобы исправить это все, что вам нужно сделать, это отредактировать файл AppServiceProvider.php и внутри метода загрузки установить длину строки по умолчанию:
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
Обновление 1
Начиная с Laravel 5.4 эти изменения больше не нужны.
Laravel 5.4 использует набор символов utf8mb4 по умолчанию, который включает в себя поддержку для хранения «emojis» в базе данных. Если вы обновляете свое приложение из Laravel 5.3, вам не нужно переключаться на этот набор символов.
Обновление 2
Текущие версии версий MariaDB НЕ поддерживают этот параметр по умолчанию по всему миру. Он реализован в MariaDB 10.2.2+ по умолчанию .
Решение
И если вы намеренно хотите использовать правильное будущее-умолчанию (начиная с Laravel 5.4), многобайтная поддержка UTF8 utf8mb4
для 😀, тогда начните исправлять 😂 конфигурацию вашей базы данных.
В Laravel config/database.php
определите:
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
DYNAMIC
позволяет хранить индексы с длинными ключами .
Настройки сервера (по умолчанию включены в MySQL 5.7.7+ / MariaDB 10.2.2+):
[mysqld] # default character set and collation collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 # utf8mb4 long key index innodb_large_prefix = 1 innodb_file_format = barracuda innodb_file_format_max = barracuda innodb_file_per_table = 1
Для клиентов:
[mysql] default-character-set=utf8mb4
И затем остановите свой сервер MySQL / MariaDB. После этого СНВ. Горячий RESTART может не работать.
sudo systemctl stop mysqld sudo systemctl start mysqld
Теперь у вас есть Laravel 5.x с поддержкой UTF8.
Если вы на или обновлены до Laravel 5.4, это сработало для меня;
Всего 1 изменение. в AppServiceProvider.php
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
Как упоминалось в руководстве по миграции https://laravel.com/docs/master/migrations#creating-indexes
Если кто-то еще наткнется на этот ответ, как я, но по другой причине, вы можете проверить свою кодировку / сопоставление в Laravel DB.
Я устанавливал приложение (Snipe-IT) и настраивал конфигурацию базы данных Laravel для использования следующего:
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci',
Удаление mb4
из обеих строк исправило проблему, хотя я считаю, что ответ Антонио – это реальное решение проблемы.
Это сработало для меня:
$table->charset = 'utf8'; $table->collation = 'utf8_unicode_ci';
Для laravel 5.4 просто отредактируйте файл
App \ Providers \ AppServiceProvider.php
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
Удалите mb4 из charset и сортировки из config / database.php, затем он будет успешно выполнен.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
Я столкнулся с той же проблемой и исправил ее, добавив следующие две строки в мое приложение / database.php
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Мой файл выглядит следующим образом:
<?php return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => env('DB_CONNECTION', 'mysql'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ......
У меня была такая же проблема, и я использую wamp
Открыть файл: config / database.php
'engine' => null, => 'engine' => 'InnoDB',
благодаря
В файле config / database.php где:
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
Измените эту строку следующим образом:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Я добавил к самой миграции
Schema::defaultStringLength(191); Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); });
да, я знаю, что мне нужно учитывать это при каждой миграции, но я предпочел бы, чтобы это было спрятано у какого-то совершенно несвязанного поставщика услуг
Измените charset на «utf8mb4» на «utf8» и
сопоставление с 'utf8mb4_unicode_ci' до 'utf8_unicode_ci'
в файле config / database.php
Это сработало для меня.
Это потому, что Laravel 5.4 использует utf8mb4, который поддерживает сохранение emojis.
Добавьте это в свое приложение \ Providers \ AppServiceProvider.php
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
и вам должно быть хорошо идти.
У вас не будет этой проблемы, если вы используете MySQL 5.7.7+ или MariaDB 10.2.2+.
Чтобы обновить MariaDB на вашем Mac, используя Brew, сначала отмените текущую brew unlink mariadb
: 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 / релизы # laravel-5.4 (прокрутите вниз до: Migration String Length )
Просто установлен MariaDB 10.2.4 RC, запускается новый пустой проект Laravel 5.4 и миграция по умолчанию (столбцы varchar (255)).
Не нужно изменять DB conf и config/database.php
Laravael config/database.php
. Таким образом, как @scorer отметил поведение по умолчанию для 10.2.2+.
Laravel использует utf8mb4
символов utf8mb4
по умолчанию, который включает в себя поддержку для хранения «emojis» в базе данных. Если вы используете версию MySQL старше версии 5.7.7 или MariaDB старше версии 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, сгенерированную миграциями, чтобы MySQL создавал для них индексы. Вы можете настроить это, вызывая метод Schema::defaultStringLength
в вашем AppServiceProvider
:
use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); }
Вы можете проверить
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
включить эту строку наверху
используйте Illuminate \ Support \ Facades \ Schema;
то внутри функции загрузки добавьте это
Схема :: defaultStringLength (191);
Если вы обновлены или обновлены до версии Laravel 5.4 и последней версии, она работает;
Всего 1 изменение в AppServiceProvider.php
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }