解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

先说解决方法:

在laravel的app/Providers/AppServiceProvider.php中boot方法内,加入长度限制:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

至于为什么是248,那是因为在laravel给出的自带的5张表中,248是能加入的最大值(这个根据数据库版本以及字符集不同会有差别)

下面说一说解决过程:

首先,如果直接执行迁移,会抛出一个user表的错误,看错误信息也很容易理解错误原因:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

是因为字符长度太长了,在MYISAM类型表中,单列索引和组合索引的长度都是1000字节(这里表类型不同可能长度限制也不同,以及跟数据库的版本也有关系,具体得看自己的实际情况)

我们找到Schema/Builder.php中可以看到laravel给的默认值字符长度是255:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

我的字符集为utf8mb4,一个字符长度等于4字节

很显然255×4超过1000了,理论上改成250就正好等于1000,于是我在boot方法内将长度设置为250:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

然后再次执行 php artisan migrate

如我所料,user表已经可以正常迁移了,但是抛出了新的错误:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

这次报的是personal_access_tokens表,同样是索引长度的错误,而且限制也是1000个字节

WTF?

我们可以先将数字改小一些,让表创建成功,去这张表里看一眼:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

原来此索引为组合索引,字段是tokenable_type和tokenable_id,组合索引的长度为两个字段的长度和,那么会报错也就不奇怪了

我们再来看看这两个字段的类型:

解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

其中tokenable_id为bigint类型,我们都知道int类型会占用4个字符,而bigint类型则会占用8个字符

所以我们让tokenable_type腾出8个字符的空间即可,即最大长度只能设置成248

o(^▽^)o

Original: https://www.cnblogs.com/luluBear/p/16423188.html
Author: 杏寿郎
Title: 解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612723/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球