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
(
但我的 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 错误 1071 密钥太长 php artisan migrate [重复]
Laravel 迁移错误:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节 laravel 5.3