如何使用旧版本的 MariaDB 和 MySQL 安装 Laravel? (当您 运行 迁移时例外)
How to install Laravel with older versions of MariaDB and MySQL? (Exception when you run a migration)
问题
从第一次尝试开始,当我尝试 运行 我的第一个 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字符集,支持在数据库中存储"emojis"。如果您 运行ning 的 MySQL 版本早于 5.7.7 版本或 MariaDB 早于 10.2.2 版本,您可能需要手动配置迁移生成的默认字符串长度,以便MySQL 为它们创建索引。
(从 Laravel Documentation 逐字复制)
解决方案
起初,errors/exceptions 看起来应用程序不支持您的 MySQL/MariaDB 数据库。我需要改变什么吗?我需要配置东西吗?
解决方法很简单。根据 Laravel 文档,在 'Cause' 中提到,您需要指定您的 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
并开始构建很棒的东西!
问题
从第一次尝试开始,当我尝试 运行 我的第一个 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字符集,支持在数据库中存储"emojis"。如果您 运行ning 的 MySQL 版本早于 5.7.7 版本或 MariaDB 早于 10.2.2 版本,您可能需要手动配置迁移生成的默认字符串长度,以便MySQL 为它们创建索引。
(从 Laravel Documentation 逐字复制)
解决方案
起初,errors/exceptions 看起来应用程序不支持您的 MySQL/MariaDB 数据库。我需要改变什么吗?我需要配置东西吗?
解决方法很简单。根据 Laravel 文档,在 'Cause' 中提到,您需要指定您的 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
并开始构建很棒的东西!