当你创建一个迁移并且你有一个像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中的迁移是怎么回事?
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 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 1000 bytes
答案 0 :(得分:0)
我不认为独特可以为空。
这个$table->string('slug')->unique();
怎么样?
答案 1 :(得分:0)
字符编码
问题是数据库上的字符编码。最有可能的是,您使用的是4字节编码。 utf8mb4
最有可能。如果是这样,255(字符)* 4(每个字节的字节)不符合1000字节的索引限制。您提到使用250可以解决问题。那是因为它符合1000字节的索引限制。请尝试检查您的字符编码。
答案 2 :(得分:0)
有两种解决方案:升级到MySQL 5.7 或使用更短的varchars。如果您无法轻松升级,请将此文件放到AppServiceProvider.php
文件中 - 它会将默认字符串长度设置为可以正常工作的值。
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}