当我尝试使用Laravel进行php artisan迁移时,出现了这样的错误。
1071-指定的密钥太长;最大密钥长度为767字节
我可以用它作为解决方案。
但是,在我使用的MariaDB中,默认数据库引擎是InnoDB,因此无需设置此引擎选项。
那是因为我对MariaDB 10.2.2的使用应该具有与MySQL 5.7.7等效的功能。
15.1 Setting the Storage Engine
如果省略ENGINE选项,则使用默认存储引擎。默认引擎是从MySQL 5.5.5开始的InnoDB(在5.5.5之前为MyISAM)。您可以使用--default-storage-engine服务器启动选项或通过设置default-storage来指定默认引擎。 my.cnf配置文件中的-engine选项。
General Purpose¶
InnoDB是一个很好的常规事务存储引擎。 这是MariaDB 10.2(以及MySQL)的默认存储引擎。对于早期版本,XtraDB是InnoDB的性能增强分支,通常是首选。
Index Lengths & MySQL / MariaDB
Laravel默认情况下使用utf8mb4字符集,该字符集支持在数据库中存储“表情符号”。如果您运行的 MySQL版本早于5.7.7版本或MariaDB版本早于10.2.2版本( 我的MariaDB版本比10.2.2版本新10.2.10 < / em> ),您可能需要手动配置迁移产生的默认字符串长度,以便MySQL为它们创建索引。您可以通过在AppServiceProvider中调用Schema :: defaultStringLength方法进行配置:
如果设置Laravel's engine option is 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'),
]) : [],
],
为什么要在Laravel的引擎中指定InnoDB?
这是我使用的Laravel,PHP和MariaDB的版本。
答案 0 :(得分:0)
有5种解决方案:
http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
您选择最适合您的情况。
第一个项目符号提到5.7.7的限制更大。不是InnoDB,而是内置了此解决方案的MySQL版本(或MariaDB)。将InnoDB作为默认值不会影响任何已经存在的表。