当我使用laravel 5.4运行migrate命令时出现错误"特定密钥太长",我搜索并发现许多人也遇到此错误。常见的是在Schema::defaultStringLength(191);
中添加AppServiceProvider.php
。但文档https://laravel-news.com/laravel-5-4-key-too-long-error表示它适用于那些早于5.7.7的mysql版本。但是我的版本是5.7.14(mysql Ver 14.14 Distrib 5.7.14, for Win64 (x86_64)
),我已经将mysql默认字符集设置为utf8mb4(show variables like "%char%"
):
所以我认为我不需要改变任何东西,但我仍然遇到问题。这让我感到困惑。谁能帮我?感谢。
答案 0 :(得分:1)
innodb_file_format=Barracuda
innodb_large_prefix=1
innodb_default_row_format=dynamic
步骤1(innodb_file_format)和2(innodb_large_prefix)适用于较旧的Mysql版本,包括MariaDB。我不知道这些的较低版本范围。 Mysql 5.7.7 changed the defaults用于这些设置,但它们早先存在。
步骤3(innodb_default_row_format)需要Mysql 5.7.9或更高版本。
为了记录;如果您缺少innodb_default_row_format设置,则解决方法是使用引擎innodb row_format=dynamic
。这会滥用Laravel将此附加到CREATE TABLE语句而不进行任何转义的事实,从而导致... ENGINE=innodb row_format=dynamic
。
config/database.php
中的 Laravel 5.2.14 introduced the ability to specify the engine。如果您使用的是旧版本,则必须在每次创建表的迁移中指定此项。 $table->engine = 'innodb row_format=dynamic';
答案 1 :(得分:0)
我认为您应该确保将innodb_large_prefix
设置为On
。根据{{3}},它应该是Mysql> = 5.7.7中的默认值,但也许您使用非标准设置。
答案 2 :(得分:-1)
转到config / database.php 设置这个'engine'=> 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' => innodb,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],