执行以下命令时:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
我得到了这个错误信息:
#1071 - Specified key was too long; max key length is 767 bytes
columnn1和column2的信息:
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
关于为什么你会得到错误消息的答案已经被很多用户回答了。我的答案是如何修复和使用它。
从这个链接中查阅。
打开MySQL客户端(或MariaDB客户端)。它是一个命令行工具。
它会问你的密码,输入正确的密码。
使用以下命令选择您的数据库:
数据库修改
设置全局innodb_large_prefix=on;
查询OK, 0行受影响(0.00秒)
set global innodb_file_format=Barracuda;
查询OK, 0行受影响(0.02秒)
去phpMyAdmin或类似的数据库,以便于管理。>选择数据库>查看表结构>进入“操作”页签。>将ROW_FORMAT更改为DYNAMIC并保存更改。
进入表的结构选项卡>单击唯一按钮。
完成了。现在应该没有错误了。
这个修复的问题是,如果你导出数据库到另一个服务器(例如从本地主机到真实主机),你不能在该服务器上使用MySQL命令行。你不能让它在那里工作。
5解决方法:
在5.7.7中提高了限制(MariaDB 10.2.2?)。并且可以通过5.6(10.1)中的一些工作来增加它。
如果你因为试图使用字符集utf8mb4而达到极限。然后做以下其中一种(每一种都有缺点)来避免错误:
⚈ Upgrade to 5.7.7 for 3072 byte limit -- your cloud may not provide this;
⚈ Change 255 to 191 on the VARCHAR -- you lose any values longer than 191 characters (unlikely?);
⚈ ALTER .. CONVERT TO utf8 -- you lose Emoji and some of Chinese;
⚈ Use a "prefix" index -- you lose some of the performance benefits.
⚈ Or... Stay with older version but perform 4 steps to raise the limit to 3072 bytes:
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- (or COMPRESSED)
——http://mysql.rjweb.org/doc.php/limits 767 _limit_in_innodb_indexes
我在这个话题上做了一些搜索,最后得到了一些自定义更改
MySQL工作台6.3.7版本有图形界面
启动Workbench并选择连接。
转到管理或实例并选择选项文件。
如果Workbench要求您允许读取配置文件,然后按OK两次。
在中心位置的管理员选项文件窗口出现。
进入InnoDB选项卡,如果在General部分没有检查innodb_large_prefix。
设置innodb_default_row_format选项值为DYNAMIC。
对于6.3.7以下的版本,直接选项不可用,因此需要使用命令提示符
Start CMD as administrator.
Go To director where mysql server is install Most of cases its at
"C:\Program Files\MySQL\MySQL Server 5.7\bin" so command is
"cd \"
"cd Program Files\MySQL\MySQL Server 5.7\bin".
Now Run command
mysql -u userName -p databasescheema
Now it asked for password of respective user.
Provide password and enter into mysql prompt.
We have to set some global settings enter the below commands one by one
set global innodb_large_prefix=on;
set global innodb_file_format=barracuda;
set global innodb_file_per_table=true;
Now at the last we have to alter the ROW_FORMAT of required table by default its COMPACT we have to set it to DYNAMIC.
use following command
alter table table_name ROW_FORMAT=DYNAMIC;
Done