Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel 5.4 varchar场迁移_Php_Laravel - Fatal编程技术网

Php laravel 5.4 varchar场迁移

Php laravel 5.4 varchar场迁移,php,laravel,Php,Laravel,当你创建一个迁移时,你有一个像varchar这样的字符串字段,你可以像下面的代码一样设置它,但是我在迁移中得到一个错误,说它的字节太多了 Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('email')->unique(); $table->timestamps();

当你创建一个迁移时,你有一个像varchar这样的字符串字段,你可以像下面的代码一样设置它,但是我在迁移中得到一个错误,说它的字节太多了

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');            
    $table->string('email')->unique(); 
    $table->timestamps();        
});
所以如果我这样做

$table->string('email', 255)->unique(); 
将其设置为最大值255,我仍然会得到相同的错误,并且我确定255是varchar字段的最大值,但是如果我在varchar字段中设置字段250,则不会得到错误。那么laravel 5.4中的迁移是怎么回事

[照亮\数据库\查询异常]
SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为1000字节(SQL:alter table`users`add unique`users\U email\U unique`(`email`)))
[pdo异常]
SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为1000字节

我认为unique不能为null

这个
$table->string('slug')->unique()怎么样

字符编码


问题是数据库中的字符编码。最有可能的情况是,您使用的是4字节编码
utf8mb4
最有可能。如果是这样,255(字符)*4(每字符字节数)将不符合1000字节索引限制。您提到使用250可以解决这个问题。这是因为它符合1000字节的索引限制。尝试检查您的字符编码。

有两种解决方案:升级到MySQL 5.7或使用更短的varchar。如果您无法轻松升级,请将此文件放到
AppServiceProvider.php
文件中-它将默认字符串长度设置为可以正常工作的值

use Illuminate\Support\Facades\Schema;

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

我在users表上做了一次迁移,在email字段$table->string('email')->unique()中遇到了同样的问题;Unique可以为空:)