今天开始做Vape工具的采集部分,被Laravel5.7最新的Dump Server吸引,不得不说这个真的是太牛逼了!毅然决然的安装了Laravel 5.7 。但是在执行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
问题出在users表的users_email_unique字段类型上,从Laravel 5.4开始默认使用utf8mb4字符编码,而不是之前的utf8编码了。
要说我之前用5.4一直到5.6的时候为什么没有遇到这个问题呢,当时的项目都是copy之前的数据库的,而且我一直都有用utf8bm4的习惯(为了支持emoji)所以就没有用到migrate。
于是我上网搜了一圈,比如这篇,大部分说的是MYSQL版本大于5.6,或5.5.3以上就能正常运行了。但是我本机MYSQL就是5.6.35,远大于这些文章所指的mysql版本,还是不能运行,搞了半天Laravel要求的是Mysql版本是5.7.7及以上(参见官方说明),这些搜索到的结果其根本问题在于Mysql版本可用性的错误提示。
但是这些文章中通过修改AppServiceProvider文件的解决方案是可行的,大家可以参考文章去解决。
或者自己创建或者Copy别人的users表结构(migrate命令一共就创建3个表,执行失败也会创建成功2个表,就还剩一个users表)。比如Laravel5.7的users表结构:
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
而我这里选择升级MAMP大象的MYSQL版本。
通过brew安装Mysql,默认装的就是最新的,然后再用软链接映射到MAMP里,缺点是不能通过MAMP界面点“Server”来启动服务了,得走命令行。
brew install mysql
需要手动设置一下root用户的密码,跟着步骤设置就行,见下图提示。
启动mysql:
brew services start mysql
找到mysql.sock然后做符号连接到mamp里面:
ln -s /tmp/mysql.sock /Applications/MAMP/tmp/mysql
然后直接重启web服务器就可以了,不要使用mamp界面启动服务,因为那样会替换掉mysql.sock
sudo httpd -k start
此时已经成功使用5.7的mysql了,不过这个做法还不够完美,缺点是MAMP的Server启动变成命令行手动了。日后再看看还有没有好的解决方法。
发表回复