MySQL VARCHAR255UTF8对于密钥而言太长,但最大长度为1000个字节

问题描述

| 我知道对此有很多疑问,但是我认为我的数学是正确的。 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)点以使其正常工作。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...