如何解决:指定的key太长;最大密钥长度为 767 字节

Pra*_*h K 5 mysql index percona mysql-5.5

我们的服务器正在创建很多表,其中之一就是表Lock_

我们在 Percona 上使用 MySQL 5.5。我们还使用utf8_general_ciutf8

在表上创建以下索引时会抛出以下错误Lock_

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Run Code Online (Sandbox Code Playgroud)

这是创建表查询:

create table Lock_ (
    uuid_ VARCHAR(75) null,
    lockId LONG not null primary key,
    companyId LONG,
    userId LONG,
    userName VARCHAR(75) null,
    createDate DATE null,
    className VARCHAR(75) null,
    key_ VARCHAR(200) null,
    owner VARCHAR(255) null,
    inheritable BOOLEAN,
    expirationDate DATE null
);
Run Code Online (Sandbox Code Playgroud)

索引查询:

create unique index IX_DD635956 on Lock_ (className, key_, owner);
Run Code Online (Sandbox Code Playgroud)

这个问题发生在我们的一台产品服务器上(之前是独立的 mysql,后来转移到 percona,但两个版本都存在这个问题),但这在我们的开发环境中运行良好。

那么有没有办法我们可以更新 prod 环境的索引长度或其他东西,这样它就不会抛出这个错误?

谢谢

Dav*_*ett 4

我怀疑差异是 Unicode 长度问题。由于您没有使用每字符单字节排序规则,因此密钥中字段的总长度是 530 个字符(75+200+255) 而不是 530 个字节,并且 530 个字符很容易超过 767 个字节,具体取决于您在这些字符串中存储的是什么语言(事实上,如果 mysql 总是像 MS SQL Server 在其 NVARCHAR 列类型中那样存储每个字符两个字节的 unicode 数据,那么肯定会是这样)。

至于为什么它在 Dev 中工作但不在 live 中:

  • 如果 mysql 不使用固定长度编码,那么生产中某些行中的现有数据可能足够长,足以突破 767 字节的限制,但在 Dev 中没有这样的行。该length()函数(http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length)返回字节数,而不是字符数,因此您可以通过选择 where 来扫描此类行LENGTH(className)+LENGTH(key)+LENGTH(owner) > 767
  • 否则,开发和生产之间的排​​序规则设置可能不相同,请尝试验证这些设置。