热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1071Specifiedkeywastoolong;maxkeylengthis1000bytes

Laravel数据i迁移报错PDOException::(SQLSTATE[42000]:Syntaxerrororaccessviolation:1071Specifiedke

 


Laravel 数据i迁移报错 PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")

https://zxyy.me/post-185.html

2020年06月20日下午 07:11:26 »  本文:11337字

 

每次新安装的Laravel,在执行数据库迁移操作时都会报错提示一个有关于字符串长度的报错,原因:字段太长导致无法加索引。

网上有许多同类的人和我遇到了,有的人说是MySQL的版本问题,但我尝试发现就算是用MySQL8.0版本都无济于事,那么我就整理一下所有我遇到的解决方法一一列出,希望能帮到你。

 

一、MySQL版本,指定默认字符串长度

Laravel 默认使用 utf8mb4 字符,它支持在数据库中存储 "emojis" 。 如果你是在版本低于 5.7.7 的 MySQL release 或者版本低于 10.2.2 的 MariaDB release 上创建索引,那就需要你手动配置迁移生成的默认字符串长度。

打开app/Providers/AppServiceProvider.php文件,从中调用Schema::defaultStringLength方法来配置它,注意头部的use

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

 

二、开启数据库的innodb_large_prefix选项

使用管理员身份登录到MySQL,并执行如下命令,限制值则会上升到3072

mysql> set global innodb_file_format = BARRACUDA;
Query OK, 0 rows affected (0.00 sec)mysql> set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)

 

三、修改vendor目录文件,将默认字符串写死

打开vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php文件,找到第39行

public static $defaultStringLength = 255;//改为
public static $defaultStringLength = 191;

 

 

四、修改字段长度

打开database/migrations/2014_10_12_000000_create_users_table.php文件,修改user表email字段长度

$table->string(''email'')->unique();//改为
$table->string(''email'', 191)->unique()->change();

 

 

 

{注} 只有下面的字段类型能被 "修改": bigInteger、 binary、 boolean、date、dateTime、dateTimeTz、decimal、integer、json、 longText、mediumText、smallInteger、string、text、time、 unsignedBigInteger、unsignedInteger and unsignedSmallInteger。

上面的几种方法其实也不一定只适用于Laravel,道理都是一样的,如果禁用innodb_large_prefix,不管是什么表,索引键前缀限制为767字节。

例如改变varchar的字符数,改成低于上限的值就可以了。如varchar(64)。

我们需要修改字段长度,注意编码格式,utf8 下 3 字节表示一个字符,utf8mb4 是 4 字节表示一个字符,以 innodb 存储引擎来换算:utf8 下长度 255 的字符索引占 255X3=765 字节,但 Laravel 默认使用 utf8mb4 ,这样 255X4=1020,超过了 767 字节,改成 191 后,191X4=764 字节。这也是为什么要指定默认字符串长度191,其实如果你用不么这么长,指定小于191的也可以。所以修改字段长度时要根据报错提示的长度以及你字段的长度和编码来修改;

 

https://zxyy.me/post-185.html

 

 

 

 

 

 

 


推荐阅读
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 一文详解Linux
    Linuxnetfilter与VRF实验环境如下图所示:配置如下:#!binbashsudoipnetnsaddns1sudoiplinkaddns1veth1typevethpe ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了如何在Apache Kafka中进行Topic级别的配置,包括创建、修改和删除配置参数的具体步骤,并提供了详细的配置属性表。 ... [详细]
author-avatar
伊雅曦1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有