如何在旧版本的MariaDB和MySQL中安装Laravel? (运行迁移时发生异常)

时间:2018-11-02 08:40:29

标签: php mysql laravel mariadb laravel-migrations

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

  

[Illuminate \ Database \ QueryException]   SQLSTATE [42000]:语法错误或访问冲突:1071指定的密钥太长;默认值为0。最大密钥长度为767字节(SQL:alter table用户添加唯一的users_email_unique(email))

     

[PDOException]   SQLSTATE [42000]:语法错误或访问冲突:1071指定的密钥太长;默认值为0。最大密钥长度为767字节

当我第一次看到这些异常时,我曾以为自己毁了整个应用程序。

如何解决此问题并解决(或解决)此问题?

1 个答案:

答案 0 :(得分:0)

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

原因
Laravel默认使用utf8mb4字符集,该字符集支持在数据库中存储“表情符号”。如果运行的MySQL版本早于5.7.7发行版或MariaDB版本低于10.2.2,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为它们创建索引。
(从Laravel Documentation复制的单词)

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

解决方案很简单。根据“原因”中提到的Laravel文档,您需要指定defaultStringLength,该文件由Schema管理。

您需要在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()
    {
        //
    }
}

您只需要更改两个规则。

  1. usings中,您需要添加Schema
    use Illuminate\Support\Facades\Schema;
  2. 您需要在启动方法中指定defaultStringLength
    Schema::defaultStringLength(191);

更改后,代码应类似于:

<?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并开始构建很棒的东西!