Laravel 5.4: Specified key was too long 错误
Laravel 5.4: Specified key was too long error
我在使用 laravel 迁移命令时遇到问题。它显示:
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
))
但是我的 mysql 版本是 5.7.14,我的字符集是 :
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | D:\wamp64\bin\mysql\mysql5.7.14\share\charsets\ |
+--------------------------+-------------------------------------------------+
所以应该没有医生说的任何问题。有人可以帮助我吗?
错误消息中提到的1000 bytes
表明您的存储引擎是MyISAM 而不是InnoDB。 MySql 5.7.7 中与密钥长度相关的更改特定于 InnoDB 引擎。
您要么需要将 table 移动到 InnoDB 存储引擎,要么如果您必须使用 MyISAM,则需要使用 in the documentation 提到的 Schema::defaultStringLength(191);
语句。
// AppServiceProvider
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
最新版本 MySQL 5.7.7 或更高版本不会出现任何错误,但对于任何 laravel 版本中的以下版本,您需要在文件中添加一行 AppServiceProvider.php
放在 app/Providers/AppServiceProvider.php
您需要更新如下:
public function boot()
{
Schema::defaultStringLength(191);
}
请不要忘记添加行
use Illuminate\Support\Facades\Schema;
在文件的顶部。
With the reference of the blog below:
https://laravel-news.com/laravel-5-4-key-too-long-error
这里工作的方法是传递带有键名(一个短的)的第二个参数:
$table->string('email')->unique(null,'email');
设置 Schema::defaultStringLength(191)
并不总是有效,即如果您使用 Telescope。此错误的主要原因是 mysql 引擎。 Laravel 默认为 InnoDB 配置,您的数据库可能默认配置为使用 MyISAM。要正确修复它,最好编辑 config\database.php
并在 mysql 配置更改
'engine' => null
至
'engine' => 'InnoDB'
Ref:
Index Lengths & MySQL / MariaDB
Laravel uses the utf8mb4 character set by default, which includes
support for storing "emojis" in the database. If you are running a
version of MySQL older than the 5.7.7 release or MariaDB older than
the 10.2.2 release, you may need to manually configure the default
string length generated by migrations in order for MySQL to create
indexes for them. You may configure this by calling the
Schema::defaultStringLength method within your AppServiceProvider
(app\Providers\AppServiceProvider.php) :
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
在 config/database.php
中,将此行替换为 mysql:
'engine' => null',
至
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
而不是设置字符串长度限制。
我在使用 laravel 迁移命令时遇到问题。它显示:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table
users
add uniqueusers_email_unique
(
但是我的 mysql 版本是 5.7.14,我的字符集是 :
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | D:\wamp64\bin\mysql\mysql5.7.14\share\charsets\ |
+--------------------------+-------------------------------------------------+
所以应该没有医生说的任何问题。有人可以帮助我吗?
错误消息中提到的1000 bytes
表明您的存储引擎是MyISAM 而不是InnoDB。 MySql 5.7.7 中与密钥长度相关的更改特定于 InnoDB 引擎。
您要么需要将 table 移动到 InnoDB 存储引擎,要么如果您必须使用 MyISAM,则需要使用 in the documentation 提到的 Schema::defaultStringLength(191);
语句。
// AppServiceProvider
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
最新版本 MySQL 5.7.7 或更高版本不会出现任何错误,但对于任何 laravel 版本中的以下版本,您需要在文件中添加一行 AppServiceProvider.php
放在 app/Providers/AppServiceProvider.php
您需要更新如下:
public function boot()
{
Schema::defaultStringLength(191);
}
请不要忘记添加行
use Illuminate\Support\Facades\Schema;
在文件的顶部。
With the reference of the blog below: https://laravel-news.com/laravel-5-4-key-too-long-error
这里工作的方法是传递带有键名(一个短的)的第二个参数:
$table->string('email')->unique(null,'email');
设置 Schema::defaultStringLength(191)
并不总是有效,即如果您使用 Telescope。此错误的主要原因是 mysql 引擎。 Laravel 默认为 InnoDB 配置,您的数据库可能默认配置为使用 MyISAM。要正确修复它,最好编辑 config\database.php
并在 mysql 配置更改
'engine' => null
至
'engine' => 'InnoDB'
Ref:
Index Lengths & MySQL / MariaDB
Laravel uses the utf8mb4 character set by default, which includes support for storing "emojis" in the database. If you are running a version of MySQL older than the 5.7.7 release or MariaDB older than the 10.2.2 release, you may need to manually configure the default string length generated by migrations in order for MySQL to create indexes for them. You may configure this by calling the Schema::defaultStringLength method within your AppServiceProvider (app\Providers\AppServiceProvider.php) :
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
在 config/database.php
中,将此行替换为 mysql:
'engine' => null',
至
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
而不是设置字符串长度限制。