Laravel迁移:即使指定,唯一的关键是太长

我正在尝试在Laravel中迁移用户表。 当我运行我的迁移时,我得到这个错误:

[Illuminate \ Database \ QueryException] SQLSTATE [42000]:语法错误或访问冲突:1071指定的键过长; 最大密钥长度是767字节(SQL:alter table users添加唯一的users_email_uniq( email ))

我的移民如下:

 Schema::create('users', function(Blueprint $table) { $table->increments('id'); $table->string('name', 32); $table->string('username', 32); $table->string('email', 320); $table->string('password', 64); $table->string('role', 32); $table->string('confirmation_code'); $table->boolean('confirmed')->default(true); $table->timestamps(); $table->unique('email', 'users_email_uniq'); }); 

一些谷歌search后,我遇到了这个错误报告 ,泰勒说,你可以指定索引键作为unique() ,我已经完成的第二个参数。 它仍然给出了错误。 这里发生了什么?

为您的电子邮件指定较小的长度:

 $table->string('email', 250); 

其实是默认的:

 $table->string('email'); 

你应该很好。

对于Laravel 5.4,你可以在这个Laravel 5.4中find一个解决scheme:指定键太长错误,Laravel News post:

正如“迁移指南”中所述,要解决此问题,您只需编辑AppServiceProvider.php文件,并在引导方法中设置默认的string长度:

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

更新1

从Laravel 5.4开始,这些变化就不再需要了。

Laravel 5.4默认使用utf8mb4字符集,其中包括在数据库中存储“emojis”的支持。 如果您要从Laravel 5.3升级应用程序,则不需要切换到此字符集。

更新2

当前的产品MariaDB版本支持全局默认设置。 它在默认情况下在MariaDB 10.2.2+中实现。

如果你有意使用正确的future-default(从Laravel 5.4开始)支持UTF8多字节utf8mb4😀然后开始修复你的数据库configuration。

在Laravel config/database.php定义:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', 

DYNAMIC允许存储长键索引。

服务器设置(默认包含在MySQL 5.7.7+ / MariaDB 10.2.2+中):

 [mysqld] # default character set and collation collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 # utf8mb4 long key index innodb_large_prefix = 1 innodb_file_format = barracuda innodb_file_format_max = barracuda innodb_file_per_table = 1 

对于客户:

 [mysql] default-character-set=utf8mb4 

然后停止你的MySQL / MariaDB服务器。 之后,开始。 热重启可能不起作用。

 sudo systemctl stop mysqld sudo systemctl start mysqld 

现在你已经有了支持UTF8的Laravel 5.x。

如果你正在或更新Laravel 5.4这对我有效;

只是一个变化。 在AppServiceProvider.php中

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

如迁移指南https://laravel.com/docs/master/migrations#creating-indexes中所述;

如果有人像我一样绊倒了这个答案,但由于其他原因,你可能会检查你的Laravel数据库字符集/整理。

我正在安装应用程序(Snipe-IT),并configuration了Laravel数据库configuration以使用以下内容:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 

mb4两个string中删除mb4解决了这个问题,尽pipe我相信Antonio的答案是解决问题的真正方法。

这对我工作:

  $table->charset = 'utf8'; $table->collation = 'utf8_unicode_ci'; 

从charset中删除mb4并从config / database.php中整理,然后成功执行。
'charset'=>'utf8',
'collat​​ion'=>'utf8_unicode_ci',

对于laravel 5.4,只需编辑文件

软件\供应商\ AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

我遇到了同样的问题,并通过在我的app / database.php中添加以下两行来修复它

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

我的文件如下所示:

 <?php return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => env('DB_CONNECTION', 'mysql'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ...... 

我有同样的问题,我正在使用一个wamp

解决scheme:打开文件:config / database.php

 'engine' => null, => 'engine' => 'InnoDB', 

谢谢

我join了迁移本身

 Schema::defaultStringLength(191); Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); 

是的,我知道我需要考虑每一次迁移,但我宁愿这样做,而不是把它藏在一个完全不相关的服务提供商

将charset从“utf8mb4”更改为“utf8”

collat​​ion to'utf8mb4_unicode_ci'to'utf8_unicode_ci'

在config / database.php文件中

它为我工作。

在文件config / database.php其中:

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

将此行更改为:

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

如果您使用的是MySQL 5.7.7+或MariaDB 10.2.2+,则不会出现此问题。

要使用Brew更新Mac上的MariaDB,首先取消当前的链接: brew unlink mariadb然后使用brew install mariadb --devel一个dev dev brew install mariadb --devel

安装完成后停止/启动服务运行: brew services stop mariadb brew services start mariadb

目前的开发版本是10.2.3。 安装完成后,您不必担心这一点,您可以使用utf8mb4(现在是Laravel 5.4中的默认设置),无需切换回utf8,也不需要按照Laravel文档中的build议编辑AppServiceProvider: https:// laravel .com / docs / master / releases#laravel-5.4 (向下滚动到: Migration Default String Length

刚刚安装了MariaDB 10.2.4 RC,启动了新的空白Laravel 5.4项目和默认迁移(varchar(255)列)。

无需更改DB conf和Laravael config/database.php 。 就像@scorer关于10.2.2+的默认行为一样。

Laravel默认使用utf8mb4字符集,其中包括在数据库中存储“emojis”的支持。 如果您正在运行比5.7.7版本早的MySQL版本或早于10.2.2版本的MariaDB版本,则可能需要手动configuration由迁移生成的默认string长度,以便MySQL为它们创build索引。 你可以通过在你的AppServiceProvider调用Schema::defaultStringLength方法来configuration它:

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

你可以退房

https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes

包括这条线在上面

使用Illuminate \ Support \ Facades \ Schema;

然后在启动函数里加上这个

架构:: defaultStringLength(191);

这是因为Laravel 5.4使用支持存储emojis的utf8mb4

将其添加到您的应用程序\ Providers \ AppServiceProvider.php中

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

你应该很好走。