#1071-指定的密钥太长;最大密钥长度为767字节

kd3sttzy  于 2021-06-20  发布在  Mysql
关注(0)|答案(18)|浏览(406)

当我执行以下命令时:

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

我收到了这个错误信息:


# 1071 - Specified key was too long; max key length is 767 bytes

关于第1列和第2列的信息:

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

我想 varchar(20) 只需要21字节 varchar(500) 只需要501字节。所以总字节数是522,小于767。为什么我会收到错误信息?


# 1071 - Specified key was too long; max key length is 767 bytes
gijlo24d

gijlo24d16#

关于为什么会收到错误消息的答案已经被这里的许多用户回答了。我的答案是如何修复和使用它。
请参阅此链接。
打开mysql客户端(或mariadb客户端)。它是一个命令行工具。
它会询问你的密码,输入正确的密码。
使用此命令选择数据库 use my_database_name; 数据库已更改 set global innodb_large_prefix=on; 查询正常,0行受影响(0.00秒) set global innodb_file_format=Barracuda; 查询正常,0行受影响(0.02秒)
访问phpmyadmin或类似的数据库以便于管理。>选择“数据库”>“查看表结构”>“转到操作选项卡”。>将行格式更改为动态并保存更改。
转到表的结构选项卡>单击唯一按钮。
完成。现在它应该没有错误了。
此修复程序的问题是,如果将db导出到另一台服务器(例如从localhost到real host),并且不能在该服务器中使用mysql命令行。你不能在那里工作。

zfycwa2u

zfycwa2u17#

替换 utf8mb4utf8 在导入文件中。

vatpfxk5

vatpfxk518#

767字节是MySQL5.6版(及以前版本)中innodb表的前缀限制。myisam表有1000字节长。在MySQL5.7及更高版本中,此限制已增加到3072字节。
您还必须注意,如果在utf8mb4编码的大char或varchar字段上设置索引,则必须将767字节(或3072字节)的最大索引前缀长度除以4,得到191。这是因为utf8mb4字符的最大长度是四个字节。对于utf8字符,它将是三个字节,导致最大索引前缀长度为254。
一种选择是只对varchar字段设置下限。
另一种选择(根据对此问题的答复)是获取列的子集,而不是整个金额,即:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

根据需要进行调整,以获得要应用的密钥,但我想知道是否值得检查有关此实体的数据模型,以查看是否有改进可以让您在不触及mysql限制的情况下实现预期的业务规则。

相关问题