Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13048
  • 博文数量: 3
  • 博客积分: 94
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-30 20:52
文章分类
文章存档

2012年(3)

我的朋友

分类: Mysql/postgreSQL

2012-06-14 18:37:53

   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) |
0

上一篇:MySQL扩展语法

下一篇:没有了

给主人留下些什么吧!~~

古墓20122012-06-14 19:33:17

在 CHAR, VARCHAR, BINARY或 VARBINARY 类型上建立索引一般需要限制长度,例如在customer 表的name列上建立前缀为10的索引:
CREATE INDEX part_of_name ON customer (name(10));