调用未定义的方法 Illuminate\Database\Schema\MySqlBuilder::defaultStringLength()

Call to undefined method Illuminate\Database\Schema\MySqlBuilder::defaultStringLength()

首先我在

中遇到了错误
php artisan migrate

作为

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

然后我在 laracasts 上找到了一个 post 来解决这个问题

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

添加这个之后,当我 运行

php artisan optimize

然后我收到如下新错误

Call to undefined method Illuminate\Database\Schema\MySqlBuilder::defaultStringLength()

请协助消除所有这些错误。

defaultStringLength 在 Laravel v5.4 中引入。 Reference.

您可以更新 Laravel 版本

您指定的长度为 $table->string('coumname', 255); 您指定的长度不能超过 255。如果您保留长度参数,它将默认分配 255

在Laravel项目中找到AppServiceProvider

1.First 添加门面

use Illuminate\Support\Facades\Schema;

2.Add 引导函数中的以下行

function boot() {
  Schema::defaultStringLength(191);
}

这是因为Laravel 5.4默认使用utf8mb4字符集,其中包括支持在数据库中存储“emojis”。您可以从以下 2 种解决方案中选择任何一种:

1) 改变

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

2) 编辑位于 App\Providers\AppServiceProvider.php 的 AppServiceProvider 并将以下行添加到 boot() 方法并加载 Schema facade:

use Illuminate\Support\Facades\Schema;

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

实际上会更改数据库中的默认最大字段长度,并将最大字符串长度从 255 个字符缩短到最多 191 个字符(utf8 每个字符使用 3 个字节,而 utf8mb4 每个字符使用 4 个字节您的字段现在可以容纳少 25% 的字符 255 * 75% = 191.25)。因此,如果您不在迁移中手动设置字符串字段,则新的默认值为 191。

如果Laravel < 5.4 1.在Laravel项目中找到AppServiceProvider 2.注释行或删除引导方法

中的Schema::defaultStringLength(191)
  1. 添加使用Illuminate\Support\Facades\Schema;到 App/Providers 文件夹中的 AppServiceProvider.php 文件。

  2. 添加Schema::defaultStringLength(191);到启动函数。