如何用旧版本的mariadb和mysql安装laravel(运行迁移时出现异常)

t9aqgxwy  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(351)

问题
从第一次尝试,当我试着运行我的第一次 migrate ,事情已经很糟糕了。为什么?因为我一开始就看到了一条我从未见过的错误消息,因为我不熟悉laravel(或其他框架)。错误消息如下所示:
[illuminate\database\queryexception]sqlstate[42000]:语法错误或访问冲突:1071指定的键太长;最大密钥长度为767字节(sql:alter table users add unique users\u email\u unique(email))
[pdoexception]sqlstate[42000]:语法错误或访问冲突:1071指定的键太长;最大密钥长度为767字节
当我第一次看到这些异常时,我以为我已经毁了整个应用程序。
我如何解决这个问题和解决方法?

vptzau2j

vptzau2j1#

问题
这个问题是关于laravel的,为什么在mariadb(低于10.2.2)或mysql(低于5.7.7)的web服务器上安装它如此困难。你甚至不能运行第一次迁移。
原因
默认情况下,laravel使用utf8mb4字符集,其中包括对在数据库中存储“emojis”的支持。如果您运行的mysql版本早于5.7.7版本或10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便mysql为其创建索引。
(逐字逐句抄录自laravel文档)
解决方案
首先,错误/异常看起来像是应用程序不支持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()
    {
        //
    }
}

你只需要改变两条规则。
usings 你需要添加
Schema use Illuminate\Support\Facades\Schema; 您需要指定 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 开始建造很棒的东西!

相关问题