Когда я пытаюсь перенести php artisan с Laravel, я получаю такую ошибку.
1071 - указанный ключ был слишком длинным;максимальная длина ключа составляет 767 байт
Я могу использовать это как решение.
Однако в MariaDB, которую я использую, ядром базы данных по умолчанию является InnoDB, поэтому настройка этого параметра движка должна быть ненужной.
Это потому, что мое использование MariaDB 10.2.2 должно иметь MySQL 5.7.7эквивалентная функциональность.
Если вы опустите опцию ENGINE, будет использоваться механизм хранения по умолчанию.Движком по умолчанию является InnoDB с MySQL 5.5.5 (MyISAM до 5.5.5). Вы можете указать движок по умолчанию, используя опцию запуска сервера --default-storage-engine или установив default-storage-опция двигателя в файле конфигурации my.cnf.
InnoDB - хороший механизм хранения общих транзакций. Это механизм хранения по умолчанию от MariaDB 10.2 (а также MySQL) .Для более ранних выпусков XtraDB - это расширенная производительность InnoDB и обычно предпочтительнее.
Laravel по умолчанию использует набор символов utf8mb4, который включает в себя поддержку хранения «emojis» в базе данных.Если вы используете версию MySQL старше версии 5.7.7 или MariaDB старше версии 10.2.2 ( My MariaDB на 10.2.10 новее 10.2.2 ), вам может потребоваться вручную настроить длину строки по умолчанию, генерируемую миграциями, чтобы MySQL мог создать индексы для них.Вы можете настроить это, вызвав метод Schema :: defaultStringLength в вашем AppServiceProvider:
Если значение параметра для движка Laravel равно null
, будет использоваться InnoDBдля ядра базы данных, и я думаю, что ошибка длины ключа индекса не возникает.
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
Почему я должен указать InnoDB в движке Laravel?
Вот версииLaravel, PHP и MariaDB, которые я использую.
- Laravel v5.8.16
- mysql Ver 15.1 Distrib 10.2.10-MariaDB, для Win64 (AMD64)
- PHP 7.3.5 (cli) (сборка: 1 мая 2019, 13:17:17) (ZTS MSVC15 (Visual C ++ 2017) x64)
- Windows