为什么我可以使用Laravel的引擎选项InnoDB来避免索引大小的限制?

时间:2019-07-03 22:26:26

标签: php laravel mariadb innodb

当我尝试使用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的版本。

  • Laravel v5.8.16
  • 用于Win64(AMD64)的mysql Ver 15.1 Distrib 10.2.10-MariaDB
  • PHP 7.3.5(cli)(内置:2019年5月1日13:17:17)(ZTS MSVC15(Visual C ++ 2017)x64)
  • Windows

1 个答案:

答案 0 :(得分:0)

有5种解决方案:

http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

您选择最适合您的情况。

第一个项目符号提到5.7.7的限制更大。不是InnoDB,而是内置了此解决方案的MySQL版本(或MariaDB)。将InnoDB作为默认值不会影响任何已经存在的表。