博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
laravel报错1071 Specified key was too long; max key length is 1000 bytes
阅读量:7064 次
发布时间:2019-06-28

本文共 961 字,大约阅读时间需要 3 分钟。

Laravel 默认使用utf8mb4字符编码,而不是的utf8编码。因此运行php artisan migrate会出现如下错误:

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

问题根源

MySql支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会出现插入异常。三个字节UTF-8最大能编码的Unicode字符是0xffff,即Unicode中的基本多文种平面(BMP)。因而包括Emoji表情(Emoji是一种特殊的Unicode编码)在内的非基本多文种平面的Unicode字符都无法使用MySql的utf8字符集存储。

这也应该就是Laravel改用4字节长度的utf8mb4字符编码的原因之一。不过要注意的是,只有MySql 5.5.3版本以后才开始支持utf8mb4字符编码(查看版本:selection version();)。如果MySql版本过低,需要进行版本更新。

解决问题

1.首先确保MySql版本在5.5.3以上

2.手动配置迁移命令migrate生成的默认字符串长度,在AppServiceProvider文件的boot方法调用Schema::defaultStringLength方法来实现配置:

public function boot(){    //设置默认字符串长度    Schema::defaultStringLength(191);}

 

转载于:https://www.cnblogs.com/jxl1996/p/10340062.html

你可能感兴趣的文章
Servlet、Filter、Listener总结
查看>>
[翻译] JTBorderDotAnimation
查看>>
关于Thread类中三个interrupt方法的研究与学习(转)
查看>>
mysql 加入列,改动列,删除列。
查看>>
UML的学习
查看>>
x265探索与研究(六):main()函数
查看>>
UITableView分页
查看>>
跟我一起数据挖掘(13)——矩阵分解
查看>>
CAShapeLayer(持续更新)
查看>>
JAVA UUID 生成唯一标识
查看>>
spring学习笔记(4)依赖注入详解
查看>>
菜鸟学自动化测试(五)-----selenium命令之定位页面元素
查看>>
【SICP练习】64 练习2.35
查看>>
PSK星座对象(constellation.cc)
查看>>
Linux链接脚本学习--lds
查看>>
Android将list数据通过LitePal保存到本地(集合保存到本地)
查看>>
hdu 1285 确定比赛名次
查看>>
Eureka微服务实战-服务提供者
查看>>
简单的原生ajax
查看>>
h5开发坑点小总结
查看>>