先说解决方法:
在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