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

时间:2017-02-08 05:25:28

标签: php laravel-5 artisan artisan-migrate

首先我在

中收到错误
php artisan migrate

as

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

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

use Illuminate\Support\Facades\Schema;

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

添加后,当我运行

php artisan optimize

然后我会看到如下新错误

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

请协助解决所有这些错误。

5 个答案:

答案 0 :(得分:5)

defaultStringLength在Laravel v5.4中引入。 Reference

您可以更新Laravel版本

OR

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

答案 1 :(得分:1)

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

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。

答案 2 :(得分:0)

在Laravel Project中查找AppServiceProvider

1.First Add Facade

use Illuminate\Support\Facades\Schema;

2.在启动功能中添加以下行

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

答案 3 :(得分:0)

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

  2. 添加Schema :: defaultStringLength(191);到启动功能。

答案 4 :(得分:-1)

如果Laravel< 5.4  1.在Laravel Project中查找AppServiceProvider  2.在引导方法

中注释行或删除Schema :: defaultStringLength(191)