问题描述
|
我知道对此有很多疑问,但是我认为我的数学是正确的。
MysqL每个UTF8字符保留3个字节。
MyISAM允许长度为1000个字节的密钥。
我的UTF8 VARCHAR(255)应该是
255 * 3 = 765
字节
除非UNQUE每个条目需要额外的200+字节,否则为什么这样做不起作用?
MysqL> ALTER TABLE entry ADD UNIQUE INDEX (name(255));
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
有什么我可以做的吗?
编辑:
原来限制为250。对于唯一索引,字符数似乎为4个字节,但我不知道为什么。
编辑2:
感谢Vladislav Vaintroub,这个字符集确实是utf8mb4。那解决了这个谜。我没有看到有关此更改的任何文档。
我猜想它通过隐式截断字段来构建非唯一索引,这对于唯一索引是不可接受的,因此它拒绝了。
如果您重新输入评论作为答案,我很乐意接受。
解决方案:指定utf8,而不是utf8mb4(MysqL Admin不允许这样做,因此请手动创建表)
解决方法
如果您使用的是utf8mb4,并且varchar列上的唯一索引长度超过191个字符,则需要打开innodb_large_prefix以允许索引中使用更大的列,因为utf8mb4比utf8需要更多的存储空间或latin1。将以下内容添加到您的my.cnf文件中。
[mysqld]
innodb_file_format=barracuda
innodb_file_per_table=1
innodb_large_prefix=1
init_connect=\'SET collation_connection = utf8mb4_unicode_ci\'
init_connect=\'SET NAMES utf8mb4\'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
有关MySQL 5.7文档的原因和未来的更多信息:
如果启用了innodb_large_prefix(MySQL 5.7.7中的默认设置),则
使用的InnoDB表的索引键前缀限制为3072个字节
动态或压缩行格式。如果禁用了innodb_large_prefix,
对于任何行格式的表,索引键前缀限制为767个字节。
innodb_large_prefix在MySQL 5.7.7中已弃用,将被删除
在将来的版本中。 innodb_large_prefix是MySQL 5.5中引入的
禁用大索引键前缀以与早期版本兼容
不支持大索引键前缀的InnoDB版本。
综上所述,该限制仅出于兼容性考虑,在以后的版本中将增加。
, 任何需要更大密钥长度的人都应该查看innodb_large_prefix
请访问http://dev.mysql.com/doc/refman/5.5/zh-CN/innodb-parameters.html#sysvar_innodb_large_prefix
, MySQL保留4个字节的3个字段的最大数量,因此这就是为什么超过1000个字节的限制。我的建议是创建小于255的varchar
或不带without3ѭ创建它。
这两种解决方案可能都不适合您,或者您已经尝试过了。
我能想到的唯一其他解决方案是将列分成2个小列,并在这两个字段上创建唯一索引,但是我相信您会遇到与上述相同的错误。
由于您可能需要UTF8
,因此我会认真考虑将varchar(255)
列减小到250(或249)点以使其正常工作。