执行以下命令时:

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

当前回答

更改排序规则。您可以使用支持几乎所有功能的utf8_general_ci

其他回答

laravel 5.7到9.0

应遵循的步骤

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

就这些,好好享受吧。

MySQL对字符串中每个字符的字节数假设最坏的情况。对于MySQL 'utf8'编码,每个字符是3个字节,因为该编码不允许字符超过U+FFFF。对于MySQL 'utf8mb4'编码,它是每个字符4字节,因为这是MySQL所谓的实际UTF-8。

因此,假设您使用'utf8',那么您的第一列将占用索引的60字节,第二列将占用索引的1500字节。

更改排序规则。您可以使用支持几乎所有功能的utf8_general_ci

这解决了我的问题

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE

将抱怨索引字段的CHARSET更改为“latin1” 例如:ALTER TABLE tbl CHANGE myfield varchar(600) CHARACTER SET latin1 DEFAULT NULL Latin1为一个字符使用一个字节,而不是四个