先说解决方法:

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

 

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

 

下面说一说解决过程:

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

 

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

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

 

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

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

 

 然后再次执行 php artisan migrate

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

 

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

WTF?

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

 

 

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

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

 

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

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

 o(^▽^)o

posted on 2022-06-29 14:12  杏寿郎  阅读(822)  评论(0编辑  收藏  举报