如何规避 mySQL 中的最大密钥长度?

Posted

技术标签:

【中文标题】如何规避 mySQL 中的最大密钥长度?【英文标题】:how do I circumvent the max key length in mySQL? 【发布时间】:2012-06-03 19:57:30 【问题描述】:

我正在创建一个表,索引大量测量值,分布在各种文件中。在不同的表中,对于不同类型的数据,我使用数据文件的绝对路径作为唯一索引。这工作得很好。

但是,当我现在尝试在我的新表中重现该设置时,我得到了

mysql> alter table weights change column path path varchar(1000); ERROR 1071 (42000):指定的密钥太长;最大密钥长度为 767 字节

这很奇怪,因为我另一个表中的同一列被描述为:

| Field               | Type          | Null | Key | Default | Extra |
+---------------------+---------------+------+-----+---------+-------+
| path                | varchar(1000) | YES  | UNI | NULL    |       |

那么,我上次是如何绕过这个限制的呢?我应该告诉我自从创建第一个表以来我已经重新安装了 linux (& mySQL),所以很可能在我不知情的情况下更改了一些默认值。

当我启动 mySQL 时,欢迎信息是:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 128
Server version: 5.5.22-0ubuntu1 (Ubuntu)

当我搜索以前的答案时,一般的反应似乎是“嗯,就是这样”,但显然不是?

提前谢谢你:)

【问题讨论】:

这个问题的好答案可以在这里找到:***.com/questions/1814532/… 我想我完全不明白这些答案 【参考方案1】:

检查主键的定义 - 您可能在第一个表上使用了部分前缀键索引。

总体上更好的解决方案是使用文件路径的哈希作为主键并将文件路径本身存储在另一列中。

【讨论】:

什么是“文件路径哈希”? @Kaare - 类似于 MD5 或 SHA。 php 和 MySQL 都内置了散列函数。解释见这里:en.wikipedia.org/wiki/Hash_function

以上是关于如何规避 mySQL 中的最大密钥长度?的主要内容,如果未能解决你的问题,请参考以下文章

错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节

Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节

实体框架“指定的密钥太长;最大密钥长度为 1000 字节”

SonarQube 错误:组件密钥长度超过授权的最大长度

MySQL错误:没有密钥长度的密钥规范