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

标签 php mysql laravel mariadb laravel-migrations

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

[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

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

我该如何解决这个问题以及解决(或解决)这个问题?

最佳答案

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

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

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

解决方案很简单。根据 Laravel 文档,“原因”中提到,您需要指定由 Schema 管理的 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()
    {
        //
    }
}

您只需更改两条规则。

  1. usings中,您需要添加Schema
    使用 Illuminate\Support\Facades\Schema;
  2. 您需要在启动方法中指定defaultStringLength
    架构::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 并开始构建很棒的东西!

关于php - 如何使用旧版本的 MariaDB 和 MySQL 安装 Laravel? (运行迁移时异常(exception)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53115172/

相关文章:

javascript - 联系表单提交按钮在按下时不刷新

asp.net - 带有 MVC 3 的 MySql 连接器/网络

laravel - Laravel框架的 Elasticsearch 查询

php - Woocommerce:整个产品类别的最小数量,而不是变体

php - 重定向时,codeigniter Controller 名称在地址中出现两次

MySQL聚合列不同条件查询永远不会结束

php - PDOException : could not find driver when using phpunit

php - 如何使用 Laravel 5.0 作为后端来管理 session

php - 如何在 Laravel/Lumen 中捕获 401 响应?

php - 通过 OAuth 将 Google 联系人导入到 PHP 中的 Mysql