Laravel 5.4:指定的密钥太长错误[重复]

Posted

技术标签:

【中文标题】Laravel 5.4:指定的密钥太长错误[重复]【英文标题】:Laravel 5.4: Specified key was too long error [duplicate] 【发布时间】: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\ |
+--------------------------+-------------------------------------------------+

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

【问题讨论】:

【参考方案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://***.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);

【讨论】:

以上是关于Laravel 5.4:指定的密钥太长错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4数据库迁移不起作用[重复]

markdown Laravel:指定密钥错误太长

laravel 错误 1071 密钥太长 php artisan migrate [重复]

Laravel 迁移错误:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节 laravel 5.3

laravel 5.4 指定的key太长,为啥数字191

语法错误或访问冲突:1071 指定的密钥太长;最大密钥长度为 767 字节 [重复]