使用laravel migrate命令时遇到问题。它显示:
SQLSTATE [42000]:语法错误或访问冲突:1071指定密钥 太长了最大密钥长度为1000个字节(SQL:alter table
users
添加唯一users_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\ |
+--------------------------+-------------------------------------------------+
所以医生说不应该有任何问题。有人可以帮帮我吗?
答案 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'
答案 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);
}