运行迁移文件报错,字段长度过长

先说明一下,在公司的电脑没办法安装教程推荐的homestead环境.感觉可能要重装系统.或者是因为公司的网络环境,设置了内网IP所以虚拟机一直卡在Homestead启动时SSH auth method: private key;所以用了phpstudy来凑合用.

运行数据库迁移文件.返回以下错误.

C:\Users\Administrator\MyCode\blog>php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

经过查找资料,是数据版本问题导致,和字符集的问题.更换了数据库版本从5.7.26更换到8.0.12,字符集也使用了laravel推荐使用的:utf8mb4,排序规则:utf8mb4_general_ci;


删除了已生成的表,再次运行迁移文件,还是一样的错误.
当然也找到了对应的解决方法:
在app/Providers/AppServiceProvider.php中修改
但是这个设置似乎是不完美的方法,而且也是不太符合现在应用.
为了排除是代码或者框架版本问题,我单独在数据库运行了对应的sql语句.
当表结构的email字段长度为255时得到的返回结果也是同样的报错.


然后我再将email字段的长度修改成191之后,运行这句sql成功.
希望能帮我排排错,是哪里出了问题.感激不尽!

补充完问题后五分钟,突然想到会不会是表的引擎问题;查看迁移产生的表和我自己创建的表都默认使用的引擎是MyISAM,更改成InnoDB后运行SQL成功!!!!教程中在没有提及这个问题.是因为集成环境的原因还是laravel框架本身配置的原因?运行迁移文件能修改成默认生成InnoDB的引擎吗?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
3年前 评论
Young_Tao (楼主) 3年前
云客网络工作室

如果你mysql版本正确,把数据库引擎改为InnoDb就行,不需要修改文件

3年前 评论
Young_Tao (楼主) 3年前
// 修改:app\Providers\AppServiceProvider.php
use Illuminate\Support\Facades\Schema;
public function boot()
{
    Schema::defaultStringLength(100);
}

这个默认长度是可以随意修改的。正常来说,我们在数据迁移文件里面都会设置 string 的长度,这个只是给一些没有设定长度的字段一个默认长度而已。比如默认生成的 users 表。

然后有个疑问:如果是数据库引擎是innoDB,默认长度是191,为什么是191呢? :scream: :scream:

如果我用的是innoDB引擎,我也会习惯性的把这个默认长度设置为一个自己觉得合适的长度 :smiley: :smiley:

3年前 评论

在 config/database.php 中 把'engine' => null, 修改为

'engine' => null,
// ↑改为↓
'engine' => 'InnoDB',
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!