Laravel迁移:即使指定,唯一的关键是太长
我正在尝试在Laravel中迁移用户表。 当我运行我的迁移时,我得到这个错误:
[Illuminate \ Database \ QueryException] SQLSTATE [42000]:语法错误或访问冲突:1071指定的键过长; 最大密钥长度是767字节(SQL:alter table
users
添加唯一的users_email_uniq(
我的移民如下:
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',
'collation'=>'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”
collation 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); }
你应该很好走。