执行以下命令时:

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命令行。你不能让它在那里工作。

其他回答

以下是我最初的回答:

我只是删除数据库并像这样重新创建,错误就消失了: 如果rhodes存在,则删除数据库;创建数据库rhodes default 字符集utf8默认COLLATE utf8_general_ci;

然而,它并不适用于所有情况。

这实际上是在字符集为utf8(或utf8mb4)的VARCHAR列上使用索引的问题,而VARCHAR列的字符长度超过一定长度。对于utf8mb4,这个长度是191。

有关如何在MySQL数据库中使用长索引的更多信息,请参阅本文中的长索引部分:http://hanoian.com/content/index.php/24-automate-the-converting-a-mysql-database-character-set-to-utf8mb4

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

laravel 5.7到9.0

应遵循的步骤

进入App\Providers\AppServiceProvider.php。 将此添加到提供商使用Illuminate\Support\Facades\Schema;在顶部。 在Boot函数中添加这个Schema::defaultStringLength(191);

就这些,好好享受吧。

您使用的是什么字符编码?有些字符集(如UTF-16等等)每个字符使用一个以上的字节。

好吧,在我的情况下,我必须将数据库文件从mySQL 5.7恢复到mySQL 5.6,我遇到了这个问题。

根本原因是版本不兼容,并且索引的某些列长于191(默认值为255)。

所以解决方案很简单:让所有“索引列的长度”都小于191(例如180)