【问题标题】:Laravel 5.4: Specified key was too long error [duplicate]Laravel 5.4:指定的密钥太长错误[重复]
【发布时间】:2017-07-23 01:02:19
【问题描述】:

我在使用 laravel migrate 命令时遇到问题。它显示:

SQLSTATE[42000]:语法错误或访问冲突:1071 指定键 太长了;最大密钥长度为 1000 字节(SQL:alter table users 添加唯一的users_email_unique(email))

但我的 mysql 版本是 5.7.14,我的字符集是:

mysql> show variables like "%char%";
+--------------------------+-------------------------------------------------+
| Variable_name            | Value                                           |
+--------------------------+-------------------------------------------------+
| character_set_client     | utf8mb4                                         |
| character_set_connection | utf8mb4                                         |
| character_set_database   | utf8mb4                                         |
| character_set_filesystem | binary                                          |
| character_set_results    | utf8mb4                                         |
| character_set_server     | utf8mb4                                         |
| character_set_system     | utf8                                            |
| character_sets_dir       | D:\wamp64\bin\mysql\mysql5.7.14\share\charsets\ |
+--------------------------+-------------------------------------------------+

所以应该没有医生说的任何问题。有人可以帮助我吗?

【问题讨论】:

    标签: laravel laravel-5.4


    【解决方案1】:

    最新版本的 MySQL 5.7.7 或更高版本不会出现任何错误,但对于任何 laravel 版本中的以下版本,您需要在文件中添加一行 AppServiceProvider.php 放在 app/Providers/AppServiceProvider.php

    您需要更新以下内容:

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

    请不要忘记添加行

    use Illuminate\Support\Facades\Schema;
    

    在文件的顶部。

    参考以下博客: https://laravel-news.com/laravel-5-4-key-too-long-error

    【讨论】:

      【解决方案2】:

      错误消息中提到的1000 bytes 指向您的存储引擎是MyISAM 而不是InnoDB。 5.7.7 中与密钥长度相关的 MySql 更改特定于 InnoDB 引擎。

      您要么需要将表移动到 InnoDB 存储引擎,要么如果必须使用 MyISAM,则需要使用 in the documentation 中提到的 Schema::defaultStringLength(191); 语句。

      // AppServiceProvider
      
      use Illuminate\Support\Facades\Schema;
      
      public function boot()
      {
          Schema::defaultStringLength(191);
      }
      

      【讨论】:

        【解决方案3】:

        设置Schema::defaultStringLength(191) 并不总是有效,即如果您使用望远镜。此错误的主要原因是 mysql 引擎。 Laravel 默认配置为 InnoDB,您的数据库可能默认配置为使用 MyISAM。要正确修复它,最好编辑 config\database.php 并在 mysql 配置更改中

        'engine' => null
        

        'engine' => 'InnoDB'
        

        参考:https://stackoverflow.com/a/37996097/6389945

        【讨论】:

          【解决方案4】:

          config/database.php内,将这一行替换为mysql:

          'engine' => null',
          

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

          而不是设置字符串长度的限制。

          【讨论】:

          • 这里的this older answer 非常相似。如果您能解释另一个答案的差异和好处,以帮助读者决定哪个更好,那就更好了
          【解决方案5】:

          这里的工作方法是传递带有键名的第二个参数(一个短的):

          $table->string('email')->unique(null,'email');
          

          【讨论】:

            【解决方案6】:

            索引长度和 MySQL / MariaDB

            Laravel 默认使用 utf8mb4 字符集,包括 支持在数据库中存储“表情符号”。 如果您正在运行 MySQL 版本早于 5.7.7 版本或 MariaDB 早于 10.2.2版本,可能需要手动配置默认 迁移生成的字符串长度,以便 MySQL 创建 他们的索引。您可以通过调用 AppServiceProvider 中的 Schema::defaultStringLength 方法 (app\Providers\AppServiceProvider.php) :

            use Illuminate\Support\Facades\Schema;
            
            /**
             * Bootstrap any application services.
             *
             * @return void
             */
            public function boot()
            {
                Schema::defaultStringLength(191);
            }
            

            【讨论】:

              猜你喜欢
              • 2020-11-10
              • 2012-08-04
              • 2017-02-27
              • 2019-02-21
              • 2017-03-13
              • 1970-01-01
              • 2014-01-21
              • 1970-01-01
              • 2012-05-25
              相关资源
              最近更新 更多