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

0vvn1miw  于 2021-06-15  发布在  Mysql
关注(0)|答案(18)|浏览(575)

当我执行以下命令时:

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
eqqqjvef

eqqqjvef16#

我认为varchar(20)只需要21字节,而varchar(500)只需要501字节。所以总字节数是522,小于767。为什么我会收到错误信息?
utf8需要每个字符3个字节来存储字符串,因此在您的情况下,20+500个字符=203+5003=1560个字节,这超过了允许的767个字节。
utf8的限制是767/3=255个字符,对于每个字符使用4个字节的utf8mb4,限制是767/4=191个字符。

如果需要使用比限制更长的列,有两种解决方案:

使用“更便宜”的编码(每个字符需要更少字节的编码)
在我的例子中,我需要在包含文章的seo字符串的列上添加唯一索引,因为我只使用 [A-z0-9\-] 搜索引擎优化字符,我用 latin1_general_ci 它每个字符只使用一个字节,所以列的长度可以是767字节。
从列中创建哈希,并仅对该列使用唯一索引
我的另一个选择是创建另一个列来存储搜索引擎优化的哈希值,这个列将有 UNIQUE 确保seo值唯一的关键。我还要补充一点 KEY 索引到原始seo列以加快查找速度。

zpf6vheq

zpf6vheq17#

laravel框架的解决方案
根据laravel 5.4.*文件;必须在 boot 方法 app/Providers/AppServiceProvider.php 文件如下:

use Illuminate\Support\Facades\Schema;

public function boot() 
{
    Schema::defaultStringLength(191); 
}

laravel 5.4给出了此修复的说明。*文档:
拉威尔使用 utf8mb4 字符集,包括在数据库中存储“emojis”的支持。如果您运行的mysql版本早于5.7.7版本或10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便mysql为其创建索引。您可以通过调用 Schema::defaultStringLength 方法 AppServiceProvider .
或者,您可以启用 innodb_large_prefix 数据库的选项。有关如何正确启用此选项的说明,请参阅数据库文档。

5t7ly7z5

5t7ly7z518#

我在这个主题上做了一些搜索,最后得到了一些自定义更改
对于mysql workbench 6.3.7版本,提供图形化的中间阶段
启动workbench并选择连接。
转到“管理”或“示例”,然后选择“选项”“文件”。
如果workbench请求您读取配置文件的权限,然后通过按两次ok来允许它。
在中心位置出现“管理员选项文件”窗口。
转到innodb选项卡并检查innodb\u large\u前缀(如果在常规部分中未选中)。
将innodb\u default\u row\u format选项值设置为dynamic。
对于低于6.3.7的版本,直接选项不可用,因此需要使用命令提示符
以管理员身份启动cmd。
转到mysql服务器所在的控制器,大多数情况下安装在“c:\program files\mysql\mysql server 5.7\bin”,所以命令是“cd\”“cd program files\mysql\mysql server 5.7\bin”。
现在运行命令mysql-u username-p databasescheema,它要求输入相应用户的密码。提供密码并输入int

相关问题