Laravel 5.4:指定密钥错误太长

时间:2017-03-03 03:23:23

标签: laravel laravel-5.4

使用laravel migrate命令时遇到问题。它显示:

  

SQLSTATE [42000]:语法错误或访问冲突:1071指定密钥   太长了最大密钥长度为1000个字节(SQL:alter table users   添加唯一users_email_uniqueemail))

但是我的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\ |
+--------------------------+-------------------------------------------------+

所以医生说不应该有任何问题。有人可以帮帮我吗?

5 个答案:

答案 0 :(得分:4)

对于最新版本的MySQL 5.7.7或更高版本,您不会收到任何错误,但对于任何laravel版本中的以下版本,您需要在放置在AppServiceProvider.php <的文件app/Providers/AppServiceProvider.php中添加一行/ p>

您需要更新以下内容:

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

请不要忘记添加

use Illuminate\Support\Facades\Schema;

位于文件顶部。

  

参考下面的博客:   https://laravel-news.com/laravel-5-4-key-too-long-error

答案 1 :(得分:2)

错误消息中提到的1000 bytes指向您的存储引擎是MyISAM而不是InnoDB。与5.7.7中密钥长度相关的MySql更改特定于InnoDB引擎。

您需要将表格移至InnoDB存储引擎,或者如果必须使用MyISAM,则需要使用Schema::defaultStringLength(191);提及的// AppServiceProvider use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 语句。

public interface LoginService {


SharedPreferences preferences = getSharedPreferences("ClientCode", Context.MODE_PRIVATE);

    @GET("api/oauth.access?client_id=" + StringConstant.CLIENT_ID + 
    "&client_secret=" + StringConstant.CLIENT_SECRET + 
    "&code="+ preferences.getString("Code",""))
    Call<LoginResponse> getLoginToken();
}

答案 2 :(得分:0)

在这里工作的方法是传递第二个参数,该参数的名称为键名(简称):

$table->string('email')->unique(null,'email');

答案 3 :(得分:0)

设置Schema::defaultStringLength(191)并不总是有效,即如果您使用望远镜。此错误的主要原因是mysql引擎。 Laravel默认情况下为InnoDB配置,并且您的数据库可能默认情况下配置为使用MyISAM。要正确修复它,最好编辑config\database.php并在mysql配置中更改

'engine' => null

'engine' => 'InnoDB'
  

参考:https://stackoverflow.com/a/37996097/6389945

答案 4 :(得分:0)

索引长度和MySQL / MariaDB

Laravel默认使用utf8mb4字符集,其中包括 支持在数据库中存储“表情符号”。 如果您正在运行 版本低于5.7.7的MySQL版本或版本低于5.7.7的MariaDB版本 10.2.2版本,则可能需要手动配置默认值 迁移生成的字符串长度,以便MySQL创建 他们的索引。您可以通过调用 AppServiceProvider中的Schema :: defaultStringLength方法 (app \ Providers \ AppServiceProvider.php):

use Illuminate\Support\Facades\Schema;

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