您好,感谢您的提问。
根据您的问题,您提到了“指定密钥太长”,这是一个与数据库相关的问题。在数据库中,密钥是用于唯一标识每个记录的一个值。如果您的密钥太长,可能会导致数据库性能下降或者其他问题。
为了解决这个问题,您可以考虑以下几种方法:
总之,处理密钥太长的问题需要根据您的具体情况来选择最佳的解决方案。无论您选择哪种方法,都需要仔细测试并确保不会影响您的应用程序的性能或功能。
问题背景 今天在Mysql建表的过程中,遇到了一个这样的问题,错误信息 1071 - Specified key was too long; max key length is 767 bytes...下面来分析如何处理 问题分析处理 根据错误提示来看是说主键key长度太长,超过了767字节。...分析主键字段PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)以及utf8mb4最大支持4个字节长度,那么这三个字段相加*3的长度远超767字节就会出现这个问题。...那么对于问题的处理就是增大索引长度限制。...以下是ROW_FORMAT的值 如果开启innodb_large_prefix,且Innodb表的存储格式为 DYNAMIC 或 COMPRESSED,则前缀索引最多可包含3072个字节,前缀索引也同样适用
错误提示是长度太长了:Specified key was too long; max key length is 767 bytes 来查看下创建表的语句: CREATE TABLE `xxl_job_registry...我们在看看错误提示: [Err] 1071 - Specified key was too long; max key length is 767 bytes。 这个就是因为联合所以长度限制的。...我们来看看MySql InnoDB引擎对索引长度的限制: mysql单索引限制: 在默认情况下,InnoDB对单一的字段索引长度限制最大为767个字节。 这个长度怎么来的呢 ?... 提示,后来通过查询资料,发现: 由于 MySQL Innodb 引擎表索引字段长度的限制为 767 字节,因此对于多字节字符集的大字段(或者多字段组合索引),创建索引会出现上面的错误。...以 utf8mb4 字符集 字符串类型字段为例:utf8mb4 是 4 字节字符集,则默认支持的索引字段最大长度是: 767 字节 / 4 字节每字符 = 191 字符,因此在 varchar(255)
错误提示是长度太长了:Specified key was too long; max key length is 767 bytes 来查看下创建表的语句: CREATE TABLE `xxl_job_registry...我们在看看错误提示: [Err] 1071 - Specified key was too long; max key length is 767 bytes。 这个就是因为联合所以长度限制的。...我们来看看MySql InnoDB引擎对索引长度的限制: mysql单索引限制: 在默认情况下,InnoDB对单一的字段索引长度限制最大为767个字节。 这个长度怎么来的呢 ?...当mysql创建数据库的时候,字符集使用的是UTF-8的时候,我们知道UTF-8每个字符使用三个字节来存储的。即:256*3-1=767了。这个767字符大小的限制就是从这里来的。...我们也知道,utf8mb4编码的每个字符使用四个字节来存储的。我们来计算下:256*4-1>767。
结果竟然出问题了,屏幕上出现: ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 二、 苦逼的探索...对于报错信息“ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes”,其实意思就是“索引字段长度太长,超过了...mysql的varchar主键只支持不超过767个字节或者768/2=384个双字节 或者767/3=255个三字节的字段 而GBK是双字节的,UTF8是三字节的。...=barracuda,innodb_file_per_table=true,并且建表的时候指定表的row_format为dynamic或者compressed(mysql 5.6中row_format默认值为...的表可以指定索引列长度大于767 bytes。
意思是如果对 BLOB 或者 TEXT 列创建索引,必须指定索引的前缀长度。...3072 个字节,如果是 MyISAM 表,前缀长度最多可以达到 1000 个字节。...(只对 DYNAMIC 或者 COMPRESSED 行格式生效,对 REDUNDANT 或者 COMPACT 行格式无效),否则只能达到 767 个字节。...创建一张 row format 是 COMPACT 的 InnoDB 表,指定前缀长度 10000,提示最大键的长度只能是 767 个字节。...表,指定前缀长度 10000,提示最大键的长度只能是 3072 个字节。
这个库是MySQL 8.0,从官方手册,可以找到这段对Index Prefixes的说明(如下所示),意思是如果对BLOB或者TEXT列创建索引,必须指定索引的前缀长度。...对于使用REDUNDANT或者COMPACT行格式的InnoDB表,索引前缀最多767个字节,对于使用DYNAMIC或者COMPRESSED行格式的InnoDB表,索引前缀的上限最多是3072个字节,如果是...MyISAM表,前缀长度最多可以达到1000个字节。...可以通过实验,验证下MySQL 8.0对于前缀长度的限制,例如创建一张row format是COMPACT的InnoDB表,指定前缀长度10000,提示最大键的长度只能是767个字节, create...指定前缀长度10000,提示最大键的长度只能是3072个字节, create table test01 ( id int(30) not null auto_increment, t_a text, primary
>>>对于myisam和innodb存储引擎,prefixes的长度限制分别为1000 bytes和767 bytes。注意prefix的单位是bytes,但是建表时我们指定的长度单位是字符。 ...>>>对于myisam和innodb存储引擎,prefixes的长度限制分别为1000 bytes和767 bytes。注意prefix的单位是bytes,但是建表时我们指定的长度单位是字符。... table test3(id varchar(256),key(id)); >>索引列长度大于767(256*3=768),所以创建表失败 ERROR 1071 (42000): Specified...的表可以指定索引列长度大于767 bytes。...的表可以指定索引列长度大于767 bytes。
参考: http://dinglin.iteye.com/blog/1681332 单列索引的长度的限制 (5.6里面默认不能超过767bytes,5.7不超过3072bytes): 起因是...这个3是字符最大占用空间(utf8)。但是在5.5以后,开始支持4个字节的uutf8。...255×4>767, 于是增加了一个参数叫做 innodb_large_prefix # 256的由来: 只是因为char最大是255,所以以前的程序员以为一个长度为255的index就够用了,...在MySQL5.7里默认 innodb_large_prefix=1 解除了767bytes长度限制,但是单列索引长度最大还是不能超过3072bytes 联合索引的长度的限制 (不能超过3072bytes... (42000): Specified key was too long; max key length is 3072 bytes 因为它创建的联合索引idx_a的长度为:255*3*5= 3825
6、varchar会使用1-3个字节来存储长度,text不会。 下图可以非常明显的看到结果: ? 总体来说: 1、char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限255。...2、varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限65535,但是有存储长度实际65532最大可用。...其次从性能方面: 索引会是影响性能的最关键因素,而对于text来说,只能添加前缀索引,并且前缀索引最大只能达到1000字节。 而貌似varhcar可以添加全部索引,但是经过测试,其实也不是。...| Specified key was too long; max key length is 767 bytes | | Warning | 1071 | Specified key was too...所以我们认为当超过255的长度之后,使用varchar和text没有本质区别,只需要考虑一下两个类型的特性即可。
我们知道,MySQL 和 Oracle 在索引上最大的一个区别,就是索引存在长度的限制。如果是超长键值,可以支持创建前缀的索引,顾名思义,取这个字段的前多少个字符/字节作为索引的键值。...MySQL 官方手册索引的章节提到了,前缀索引长度限制是和引擎相关的,如果用的是 InnoDB ,前缀上限是 767 字节,当启用 innodb_large_prefix 时,上限可以达到 3072 字节...之所以需要 utf8mb4 ,是因为之前的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。...InnoDB ,如果需要建索引,就不能超过 767bytes ,utf8 编码,2553=765 bytes ,是能建索引情况下的最大值,utf8mb4 编码,默认字符长度则应该是767除以4向下取整,...如果设置了 innodb_large_prefix ,最大长度是3072字节,utf8编码 ,10243=3072 bytes ,utf8mb4编码 ,768*4=3072 。
在创建要给表的时候遇到一个有意思的问题,提示Specified key was too long; max key length is 767 bytes,从描述上来看,是Key太长,超过了指定的 767...KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; 复制代码 我们可以看到,对于name,我们设置长度为...1000可变字符,因为采用utf8mb4编码, 所以它的大小就变成了 1000 * 4 > 767 所以再不修改其他配置的前提下,varchar的长度大小应该是 767 / 4 = 191 有兴趣的同学可以测试下...,分别指定name大小为191, 192时,是不是前面的可以创建表成功,后面的创建表失败,并提示错误Specified key was too long; max key length is 767 bytes...个字节,utf8mb4 每个字符占用4个字节,所以索引最大长度只能为191个字符,即varchar(191),若想要使用更大的字段,mysql需要设置成支持数据压缩,并且修改表属性 row_format
错误代码 1071 通常是因为在恢复数据时,数据库引擎试图创建一个键,但是该键的长度超过了数据库引擎所允许的最大长度(1000 字节)。 解决方法 要解决这个问题,你可以考虑以下几个方案: 1....缩短键的长度: 如果可能的话,修改数据模式或者表结构,使得键的长度不超过 1000 字节。你可以通过减少键的长度、使用更短的字段类型或者删除一些索引来实现。 2....例如,如果使用 utf8mb4 字符集,每个字符可能占用 4 个字节,所以最大长度会进一步减少。...innodb_large_prefix:参数控制 InnoDB 存储引擎是否支持大于 767 字节的索引前缀。将其设置为 ON 可以允许更长的索引前缀,从而使得更长的键被支持。...将其设置为 Barracuda 并启用 innodb_large_prefix 参数可以允许更长的索引前缀。
6、varchar会使用1-3个字节来存储长度,text不会。...2、varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限65535,但是有存储长度实际65532最大可用。...其次从性能方面: 索引会是影响性能的最关键因素,而对于text来说,只能添加前缀索引,并且前缀索引最大只能达到1000字节。 而貌似varhcar可以添加全部索引,但是经过测试,其实也不是。...| Specified key was too long; max key length is 767 bytes | | Warning | 1071 | Specified key was too...所以我们认为当超过255的长度之后,使用varchar和text没有本质区别,只需要考虑一下两个类型的特性即可。
我们知道,MySQL和Oracle在索引上最大的一个区别,就是索引存在长度的限制。如果是超长键值,可以支持创建前缀的索引,顾名思义,取这个字段的前多少个字符/字节作为索引的键值。 P.S. ...MySQL官方手册索引的章节提到了,前缀索引长度限制是和引擎相关的,如果用的是InnoDB,前缀上限是767字节,当启用innodb_large_prefix时,上限可以达到3072字节。...之所以需要utf8mb4,是因为之前的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会插入异常了。...InnoDB,如果需要建索引,就不能超过767bytes,utf8编码,255*3=765 bytes,是能建索引情况下的最大值,utf8mb4编码,默认字符长度则应该是767除以4向下取整,就是191...如果设置了innodb_large_prefix,最大长度是3072字节,utf8编码,1024*3=3072 bytes,utf8mb4编码,768*4=3072。
在provider上指定密钥和IV,也就是它的Key属性和IV属性。...对于特定算法,密钥和IV的值可以随意指定,但长度是固定的,通常密钥为128位或196位,IV为64位。...16字节,那么当传入的字符串key转换成数组后太短了的时候, //需要将keyData补齐为16位,数组后面空余的位数补0; //当传入的字符串key转换成数组后太长了的时候,则只取前面的...//正确的密钥长度可以通过在算法对象上调用LegalKeySizes获得(对本例来说,例如provider.LegalKeySizes)。...16字节,那么当传入的字符串key转换成数组后太短了的时候, //需要将keyData补齐为16位,数组后面空余的位数补0; //当传入的字符串key转换成数组后太长了的时候,则只取前面的
,提示错误如下, Specified key was too long; max key length is 767 bytes 从字面的意思看,是说指定键超长,而且上限是767字节。...如果用的是InnoDB,前缀上限是767字节,当启用innodb_large_prefix时,上限可以达到3072字节。如果用的是MyISAM,前缀上限是1000字节。...再看一下《MySQL 5.7 Reference Manual》,相同章节中,多了这段描述,是说当使用CREATE INDEX时,如果指定的索引前缀长度超过了列定义的长度上限,则会出现以下两种场景, 非唯一索引...,500个字符就是1500个字节,从文档我们知道,未设置innodb_large_prefix,所以键值上限是767个字节,1500>767,加索引的操作,不能执行, mysql> select version...缩小字段长度,例如x varchar(500),改为x varchar(255)。 2. 创建索引的时候,指定前缀长度,alter table ... add index ...
5.4 migrate 时报错: Specified key was too long error 1071 Specified key was too long; max key length is...767 bytes MySql 支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会出现插入异常。...三个字节 UTF-8 最大能编码的 Unicode 字符是 0xffff ,即 Unicode 中的基本多文种平面(BMP)。...这也应该就是 Laravel 5.4 改用 4 字节长度的 utf8mb4 字符编码的原因之一。...手动配置迁移命令 migrate 生成的默认字符串长度,在 app\Providers\AppServiceProders 中调用 Schema::defaultStringLength 方法来实现配置
领取专属 10元无门槛券
手把手带您无忧上云