it-swarm.com.ru

Ошибка миграции Laravel: синтаксическая ошибка или нарушение прав доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа 767 байт

Ошибка миграции на Laravel 5.4 с php artisan make:auth

[Illuminate\Database\QueryException] SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа составляет 767 байт (SQL: изменить таблицу users добавить уникальный users_email_unique (email))

[PDOException] SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа 767 байт

81
absiddiqueLive

Согласно официальной документации , вы можете решить это довольно легко.

Добавьте следующий код в AppServiceProvider.php (/app/Providers/AppServiceProvider.php)

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

123
absiddiqueLive

Я не знаю, почему вышеупомянутое решение и официальное решение, которое добавляет 

Schema::defaultStringLength(191);

в AppServiceProvider у меня не сработало . То, что сработало, отредактировало файл database.php в папке config . Просто отредактируйте 

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

в 

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

и это должно работать ... Надеюсь, это поможет.

57
Koushik Das

Я просто добавляю этот ответ сюда, так как для меня это решение quickest. Просто установите для движка базы данных по умолчанию 'InnoDB' в 

/config/database.php

'mysql' => [
    ...,
    ...,
    'engine' => 'InnoDB',
 ]

затем запустите php artisan config:cache, чтобы очистить и обновить кэш конфигурации

32
Dexter Bengil

В AppServiceProvider.php вы включаете этот код в начало файла.

use Illuminate\Support\Facades\Schema;

И вы добавляете этот код в метод загрузки.

 Schema::defaultStringLength(191);
21
user7688086

Эта проблема вызвана в Laravel 5.4 версией базы данных.

Согласно документам (в разделе Index Lengths & MySQL / MariaDB):

Laravel по умолчанию использует набор символов utf8mb4, который включает в себя поддержка хранения "смайликов" в базе данных. Если вы используете версия 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 символов. Это меньше чем официальный RFC заявляет.

Таким образом, документация также предлагает другое решение:

Кроме того, вы можете включить опцию innodb_large_prefix для вашего база данных. Обратитесь к документации вашей базы данных для получения инструкций по как правильно включить эту опцию.

17
Esteban Herrera

Для тех, кто не хочет менять 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();
12
helloroy

Добавьте приведенный ниже код в метод app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

сначала вы должны удалить (если есть) таблицу пользователей , password_resets table из базы данных и удалить записи пользователей и password_resets из migrations table, а затем после удаления старых таблиц запустить php artisan migrate команда

6
Udhav Sarvaiya

Вместо того, чтобы устанавливать ограничение по длине, я бы предложил следующее, что сработало для меня.

Внутри 

конфиг/database.php

заменить эту строку для MySQL

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

при

'engine' => null,
5
Md. Noor-A-Alam Siddique

Я решил эту проблему и отредактировал мой файл config-> database.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,
    ],
5
Ahmad Shakib

Как уже было указано, мы добавляем в AppServiceProvider.php в App/Providers

use Illuminate\Support\Facades\Schema;  // add this

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); // also this line
}

вы можете увидеть более подробную информацию в ссылке ниже (поиск "Длина индекса и MySQL/MariaDB") https://laravel.com/docs/5.5/migrations

НО ХОРОШО, это не то, что я опубликовал все о! дело даже в том, что при выполнении вышеизложенного вы, скорее всего, получите другую ошибку (именно при запуске команды php artisan migrate и из-за проблемы длины операция, скорее всего, застрянет в середине. решение ниже, и пользовательская таблица, вероятно, создается без остатка или не совсем корректно) нам нужно откатиться. откат по умолчанию не будет работать. потому что операция по миграции не понравилась закончить. Вам необходимо удалить новые созданные таблицы в базе данных вручную.

мы можем сделать это используя тинкер, как показано ниже:

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

4
Mohamed Allal

В AppServiceProvider.php file:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
3
Indian_ontop

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();
        });
    }
3
Fatema T. Zuhora

Как указано в документе Migrations guide , чтобы исправить это, все, что вам нужно сделать, это отредактировать файл app/Providers/AppServiceProvider.php и в методе загрузки установить длину строки по умолчанию:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Примечание: сначала вы должны удалить (если есть) таблицу users, таблицу password_resets из базы данных и удалить записи пользователей и password_resets из таблицы migrations.

Чтобы выполнить все оставшиеся миграции, выполните команду migrate Artisan:

php artisan migrate

После этого все должно работать как обычно.

3
user9162235

Я добавляю два решения , которые работают для меня.

1-е растворение : 

  1. Откройте файл database.php insde config dir/folder.
  2. Изменить 'engine' => null, на 'engine' => 'InnoDB',

    Это сработало для меня.

2-е решение:

  1. Откройте файл database.php insde config dir/folder.
    2 .Редактировать
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
    В 

    'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',


Удачи

3
Arslan Ahmad

Если вы столкнулись с этой ошибкой во время работы над laravel при использовании команды: «php artisan migrate» , То вы просто добавляете в файл 2 строки: app-> Providers-> AppServiceProvider.php

  1. использовать схему;
  2. Схема :: defaultStringLength (191);

пожалуйста, проверьте изображение . затем снова запустите команду "php artisan migrate" . php artisan migrate

2
Abdul Rasheed

Это часто встречается, так как Laravel 5.4 изменил установленный по умолчанию характер базы данных на utf8mb4. Что вы должны сделать, это: отредактируйте ваш App\Providers.php, поместив этот код перед объявлением класса

use Illuminate\Support\Facades\Schema;

Кроме того, добавьте это к функции загрузки Schema::defaultStringLength(191);

2
Treasure

Я только что изменил следующую строку вusersиpassword_resetsфайл миграции.

Старый: $table->string('email')->unique();

Новое: $table->string('email', 128)->unique();

Вуаля !!

2
Mahesh Gaikwad

обновите и вставьте эти строки в app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;  //insert this line
public function boot()
{
    Schema::defaultStringLength(191); //insert this line also
}

установите ваш движок базы данных в config/database.php в массиве «mysql»

'engine' => 'InnoDB',
2
Anjani Barnwal

Если у вас нет данных, уже назначенных вашей базе данных, сделайте следующее:

  1. Перейдите в app/Providers/AppServiceProvide.php и добавьте

использовать Illuminate\Support\ServiceProvider;

и внутри метода boot ();

Схема :: defaultStringLength (191);

  1. Теперь удалите записи в вашей базе данных, например, пользовательскую таблицу.

  2. запустить следующее

конфигурация php artisan: кеш

php ремесленник мигрировать

2
Levinski Polish

Если вы хотите изменить в 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 из таблицы миграции.

2
chintan kotadiya

1- Перейти к/config/database.phpи найти эти строки

'mysql' => [
    ...,
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    ...,
    'engine' => null,
 ]

и измените их на:

'mysql' => [
    ...,
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    ...,
    'engine' => 'InnoDB',
 ]

2- Runphp artisan config:cacheдля перенастройки laravel

3- Удалить существующие таблицы в вашей базе данных и затем запуститьphp artisan migrateснова

1
mohammad asghari

Рекомендуемое решение - включить опцию innodb_large_prefix в MySQL, чтобы избежать последующих проблем. А вот как это сделать:

Откройте файл конфигурации MySQL my.ini и добавьте следующие строки в строку [mysqld] следующим образом.

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

После этого сохраните изменения и перезапустите службу MySQL.

Откат, если вам нужно, а затем повторно запустите миграцию.


На случай, если проблема не устранена, перейдите в файл конфигурации базы данных и установите 

'engine' => null, to 'engine' => 'innodb row_format=dynamic'

Надеюсь, поможет!

1
Sammie

Чтобы избежать каких-либо изменений в вашем коде, просто обновите сервер MySQL до версии не ниже 5.7.7 

Ссылка на это для получения дополнительной информации: https://laravel-news.com/laravel-5-4-key-too-long-error

1
F.E Noel Nfebe

Я думаю, что форсировать StringLenght на 191 - это действительно плохая идея .... Поэтому я исследую, чтобы понять, что происходит.

Я заметил, что это сообщение об ошибке:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа 767 байт

Начал появляться после того, как я обновил свою версию MySQL. Поэтому я проверил таблицы с помощью PHPMyAdmin и заметил, что все новые таблицы были созданы с сопоставлением utf8mb4_unicode_ci вместо utf8_unicode_ci для старых.

В моем конфигурационном файле doctrine я заметил, что charset был установлен в utf8mb4, но все мои предыдущие таблицы были созданы в utf8, поэтому я предполагаю, что это какая-то магия обновления, которая начинает работать на utf8mb4.

Теперь несложное решение состоит в том, чтобы изменить линейный набор символов в вашем конфигурационном файле ORM . Затем удалить таблицы, используя utf8mb4_unicode_ci, если вы находитесь в режиме разработки, или исправить набор символов, если вы не можете их удалить.

Для Symfony 4 

изменить кодировка: utf8mb4 в кодировка: utf8 в config/packages/doctrine.yaml

Теперь мои доктрины миграции снова работают хорошо.

1
Kaizoku Gambare

Подходящие к этой работе здесь передают второй параметр с ключевым именем (коротким):

$table->string('my_field_name')->unique(null,'key_name');
0
Tiago Gouvêa

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

0
Brynn Bateman

Изменение типа моего локального сервера баз данных с "mariadb" на "mysql" исправило это для меня без необходимости редактировать какие-либо Laravel файлы.

Я следовал этому руководству, чтобы изменить тип моего сервера базы данных: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html

0
Adam Winster

Я получал эту ошибку, хотя у меня уже было (на самом деле потому что у меня уже было) Schema :: 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 решило мою проблему.

0
Jacey