Pra*_*h K 5 mysql index percona mysql-5.5
我们的服务器正在创建很多表,其中之一就是表Lock_
。
我们在 Percona 上使用 MySQL 5.5。我们还使用utf8_general_ci
和utf8
。
在表上创建以下索引时会抛出以下错误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 环境的索引长度或其他东西,这样它就不会抛出这个错误?
谢谢
我怀疑差异是 Unicode 长度问题。由于您没有使用每字符单字节排序规则,因此密钥中字段的总长度是 530 个字符(75+200+255) 而不是 530 个字节,并且 530 个字符很容易超过 767 个字节,具体取决于您在这些字符串中存储的是什么语言(事实上,如果 mysql 总是像 MS SQL Server 在其 NVARCHAR 列类型中那样存储每个字符两个字节的 unicode 数据,那么肯定会是这样)。
至于为什么它在 Dev 中工作但不在 live 中:
length()
函数(http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length)返回字节数,而不是字符数,因此您可以通过选择 where 来扫描此类行LENGTH(className)+LENGTH(key)+LENGTH(owner) > 767
。 归档时间: |
|
查看次数: |
69046 次 |
最近记录: |