Specified key was too long; max key length is 767 在MySQL中新建数据库表的时候可能会遇到这个问题。总结下来,有如下几个要点: 1) 考虑使用InnoDB引擎创建组合索引(index)时,如果某个索引列的长度超过767 -> 给出warning,索引创建成功,超过767字节的列自动取前缀索引。
2) 关于MySQL中的varchar数据类型。varchar(50)不管中文还是英文,都是存50个的。所以这涉及到表或者列的字符编码,可以使用下面的语句在create table时指定。
DEFAULT CHARSET = 'utf8';
我们知道utf-8一般使用3个字节存储一个字,它是按照最大存储空间计算可以存储的字符数。767最大长度的限制对于utf-8编码的字段来说,最多能存放767 / 3 = 255.3个字。也就是说,如果创建的索引中包含一个varchar(256)会报warning,而把它改为varchar(255)就没有warning。实验验证确实如此。
gbk编码2个字节存储一个字,因而如果某列从utf-8编码改为gbk编码,相当于可以比先前多存储1/3的字符;这在超出767不多的情况下可以解决warning的问题。
3) 使用MyISAM引擎创建索引时,这个最大长度限制是1000,而不是767。
4) 如果是超过长度限制的列作为主键或者联合主键之一(primary key),而不是普通的索引(key),则SQL执行失败,无法创建此表。
5) 考虑到字符串作索引会导致索引表过大,可以新创建一个列,存储它的md5值代替它作为索引。这样可以获得很高的存储和查询性能,代价就是查询之前先做一次md5。
阅读(3979) | 评论(1) | 转发(0) |