Laravel 5.4 常见错误:Specified key was too long

file
只是前几天骏妞儿玩 5.4 的时候就遇到这个问题了~~

Laravel 5.4 把默认数据库字符集更改成 utf8mb4,作为对存储 emojis 的支持。只要你运行的是 MySQL v5.7.7 及更高版本,那么你就不会出现本文提到的错误。

对于那些运行 MariaDB 或旧版本的 MySQL 的程序,可能会在尝试运行迁移时遇到下面的错误:

[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

如 Laravel 5.4 中关于 迁移 的文档,你要做的是编辑 AppServiceProvider.php 文件,并在 boot 方法内设置默认字符串的长度:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

然后,就没然后了。


Tips (2017 年 4 月 6 日):

Schema::defaultStringLength(191); 是设置好的默认的字符串长度,也就是说,迁移中的字段没有设置长度的话,varchar 字段会被默认成长度只有 191 哦!

参考链接:https://laravel-news.com/laravel-5-4-key-t...

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 17

我遇到了这个问题,于是我把 MariaDB 更换成 MySQL,Docker 万岁!

7年前 评论

@茄子 玩 5.4 的基本要遇到~~
file

7年前 评论

@茄子 这才是好的解决办法 哈哈哈

7年前 评论

非常感谢!点赞一万零一下

6年前 评论

@JokerLinly D:\xampp\htdocs\aaaaaaa\blog-master>npm install --no-bin-links
npm ERR! Windows_NT 6.1.7601
npm ERR! argv "D:\node.exe" "D:\node_modules\npm\bin\npm-cli.js" "install"
"--no-bin-links"
npm ERR! node v6.10.3
npm ERR! npm v3.10.10
npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE

npm ERR! unable to verify the first certificate
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR! https://github.com/npm/npm/issues

npm ERR! Please include the following file with any support request:
npm ERR! D:\xampp\htdocs\aaaaaaa\blog-master\npm-debug.log
小姐姐这个问题知道吗?

6年前 评论

提示 key too long,按上面设置迁移还是报错
Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes

6年前 评论

为什么大家都是 767 bytes 你的却是 1000 bytes

6年前 评论

@peteryan 为什么大家都是 767 bytes 你的却是 1000 bytes

6年前 评论

@JokerLinly 上面给的设置是设置字符串的默认长度的,和我的问题不一样,我的是因为索引超长了,现在解决了

6年前 评论

@peteryan :see_no_evil: 一眼就看穿咱们的问题不一样

6年前 评论

@JokerLinly Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes这个是框架默认的user报出来的,可能和框架哪里的默认设置有关系,我新建的迁移文件报出来的是1000。这个问题实质是字符串指定了长度,然后作为索引,但索引最大长度有限制,两种改法,一种缩减索引字段长度,一种增加'索引做大长度'

6年前 评论

感谢!亲测有效:100:

5年前 评论

我想问一下,楼主使用的是什么字体,很好看

5年前 评论

不管是767还是1000,问题原因都是一样的,这是因为migrate新建user表的时候对email字段建立了索引,在migrete的user文件中 email字段是string 而且没给长度参数,因此默认就给了varchar(255) 但是在mysql的MYISAM引擎中,索引字段最大长度是1000 bytes,用 email (varchar 255)做索引 255X4(指utf-8mb4)>1000,因此索引会超长,创建索引失败。
解决方法:连上mysql 把user表的varchar长度改为 1000/4=250 250以下的数就可以了 然后再给email字段手动建立下索引(navicat操作步骤是 设计user表 --索引)--因为laravel运行的migrate新建user表时创建索引这一步失败了 所以你需要手动把这个索引建立起来

最后一点想法:user表的email字段其实用不了255个字符,谁的邮箱账号会设置这么长呀,我觉得100最多最多了~~

4年前 评论

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