Laravel 5.6.17 php artisan 迁移错误与 php 7.2 [重复]
Posted
技术标签:
【中文标题】Laravel 5.6.17 php artisan 迁移错误与 php 7.2 [重复]【英文标题】:Laravel 5.6.17 php artisan migration error with php 7.2 [duplicate] 【发布时间】:2018-10-03 02:27:09 【问题描述】:我正在使用 laravel 5.6.17 和 php 7.2;当我运行php artisan migrate
命令时,我收到以下错误。
有关详细信息,已在声明的数据库中创建了默认表“users”和“migrations”。
laravel 不支持 php 7.2 吗??
Image: laravel 5.6.17 php artisan migrate error
Migration table created successfully.
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`))
at D:\xampp\htdocs\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e)
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667|
668|
Exception trace:
1 PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes")
D:\xampp\htdocs\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
2 PDOStatement::execute()
D:\xampp\htdocs\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
Please use the argument -v to see more details.
【问题讨论】:
您的问题出在您的 SQL 中,而不是在 artisan 中,不在 PHP 中,也不在 Laravel 中。你试图索引一些东西,它不适合索引。发布您的迁移,不要将互联网上的随机代码作为解决方案,因为您得到的不是解决方案,它只会隐藏问题。 这不是重复的,因为提供的答案是废话且不正确。 【参考方案1】:在 AppServiceProvider.php 中,将此代码包含在文件顶部。
use Illuminate\Support\Facades\Schema;
然后你在启动方法中添加这段代码
Schema::defaultStringLength(191);
【讨论】:
如果它的工作,请接受答案 这并不能解决任何问题,它只是隐藏了实际问题。 未来的读者 - 不要使用它。解决真正的问题。【参考方案2】:是的,我得到了答案on the following link...
只要从你的根目录<ROOT>/app/Providers/AppServiceProvider.php
去下面的文件
之后:
1) 文件顶部的导入架构:use Illuminate\Support\Facades\Schema;
2) 并在boot方法中定义字符串的长度:Schema::defaultStringLength(191);
// Import Schema
use Illuminate\Support\Facades\Schema;
// ...
class AppServiceProvider extends ServiceProvider
public function boot()
// Add the following line
Schema::defaultStringLength(191);
// ...
【讨论】:
Schema::defaultStringLength(191)
到底是做什么的?为什么它可以解决问题?你明白问题出在哪里了吗?
它修复了以下错误PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes")
你了解Schema::defaultStringLength(191)
做什么?您了解为什么会出现问题吗?
解决问题的真正方法是添加另一列,例如email_hash
,然后散列电子邮件的值,将其存储到该列并制作该列独特。您的索引将具有固定长度。您不必求助于您不理解并且可能破坏您的数据库的骇人听闻的解决方案。这就是为什么您需要发布迁移的相关代码。不要接受你不理解和没有解释的答案。那家伙只是随机复制了一些垃圾代码并给了你,你信任他。背后的零解释。
我在 up() 函数下的 CreateUsersTable
类中定义长度,而不是在 AppServiceProvider
类中定义它。这是:$table->string('email', 191)->unique();
以上是关于Laravel 5.6.17 php artisan 迁移错误与 php 7.2 [重复]的主要内容,如果未能解决你的问题,请参考以下文章