Php 如何使用旧版本的MariaDB和MySQL安装Laravel?(运行迁移时出现异常)

Php 如何使用旧版本的MariaDB和MySQL安装Laravel?(运行迁移时出现异常),php,mysql,laravel,mariadb,laravel-migrations,Php,Mysql,Laravel,Mariadb,Laravel Migrations,问题 从第一次尝试开始,当我尝试运行我的第一次迁移时,事情已经非常糟糕了。为什么?因为我对Laravel(或其他框架)不熟悉,所以我立即开始了一条我从未见过的错误消息。错误消息如下所示: [照亮\数据库\查询异常] SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter table users add unique users\U email\U unique(电子邮件)) [例外情况] SQLSTATE[42000]:语法错误或

问题
从第一次尝试开始,当我尝试运行我的第一次
迁移时,事情已经非常糟糕了。为什么?因为我对Laravel(或其他框架)不熟悉,所以我立即开始了一条我从未见过的错误消息。错误消息如下所示:

[照亮\数据库\查询异常] SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter table users add unique users\U email\U unique(电子邮件))

[例外情况] SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节

当我第一次看到这些异常时,我以为我已经破坏了整个应用程序


如何解决此问题和解决方法?

问题
这个问题是关于Laravel的,以及为什么在带有MariaDB(低于10.2.2)或MySQL(低于5.7.7)的Web服务器上安装它如此困难。您甚至可能无法运行第一次迁移

原因
默认情况下,Laravel使用utf8mb4字符集,其中包括对在数据库中存储“emojis”的支持。如果您运行的MySQL版本早于5.7.7版本或早于10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为其创建索引
(逐字逐句从中复制)

解决方案
首先,这些错误/异常看起来像是应用程序不支持MySQL/MariaDB数据库。我需要改变什么吗?我需要配置东西吗

解决办法很简单。根据“原因”中提到的Laravel文档,您需要指定由
模式管理的
defaultStringLength

您需要在Laravel安装中编辑一个文件,该文件位于
app/Providers/AppServiceProvider.php

默认页面如下所示:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
这将告诉您的迁移如何处理
defaultStringLength
,以及如何处理它。在添加这些内容之后,您应该能够运行第一个
php artisan migrate
,并开始构建很棒的东西