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

先说明一下,在公司的电脑没办法安装教程推荐的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的引擎吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
4年前 评论
Young_Tao (楼主) 4年前
云客网络工作室

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

4年前 评论
Young_Tao (楼主) 4年前
// 修改: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:

4年前 评论

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

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

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