在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes.

MySQL版本为Server version: 5.1.36, 执行SQL为:

alter table pre_common_diy_data modify column targettplname varchar(255);

如果是按一个字符占两个字节计算 2*255=510 并没有超过1000字符,怎么会报错呢?

在查询相关资料后发现,MySQL MyIsam 存储引擎在创建索引的时候,索引键长度是有一个较为严格的长度限制的,所有索引键最大长度总和不能超过1000,而且不是实际数据长度的总和,而是索引键字段定义长度的总和。

主要字符集的计算方式如下:

latin1 = 1 byte = 1 character

uft8 = 3 byte = 1 character

gbk = 2 byte = 1 character

1、查看MySQL存储引擎,默认存储引擎为MyISAM。

mysql> show engines;

+------------+---------+-----------------------------------------------------------+--------------+------+------------+

| Engine     | Support | Comment                                                   | Transactions | XA   | Savepoints |

+------------+---------+-----------------------------------------------------------+--------------+------+------------+

| MRG_MYISAM | YES     | Collection of identical MyISAM tables                     | NO           | NO   | NO         |

| CSV        | YES     | CSV storage engine                                        | NO           | NO   | NO         |

| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables | NO           | NO   | NO         |

| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance    | NO           | NO   | NO         |

+------------+---------+-----------------------------------------------------------+--------------+------+------------+

4 rows in set (0.00 sec)

2、我们查看MySQL表结构,总索引长度为:(100+80)=180

mysql> desc pre_common_diy_data;

+---------------+-----------------------+------+-----+---------+-------+

| Field         | Type                  | Null | Key | Default | Extra |

+---------------+-----------------------+------+-----+---------+-------+

| targettplname | varchar(100)          | NO   | PRI |         |       |

| tpldirectory  | varchar(80)           | NO   | PRI |         |       |

| primaltplname | varchar(255)          | NO   |     |         |       |

| diycontent    | mediumtext            | NO   |     | NULL    |       |

| name          | varchar(255)          | NO   |     |         |       |

| uid           | mediumint(8) unsigned | NO   |     | 0       |       |

| username      | varchar(15)           | NO   |     |         |       |

| dateline      | int(10) unsigned      | NO   |     | 0       |       |

+---------------+-----------------------+------+-----+---------+-------+

8 rows in set (0.00 sec)

3、查看表的字符集,为utf8字符,那么索引总长度为:180*3=480

mysql> show create table pre_common_diy_data;

+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table               | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |

+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| pre_common_diy_data | CREATE TABLE `pre_common_diy_data` (

`targettplname` varchar(240) NOT NULL DEFAULT '',

`tpldirectory` varchar(80) NOT NULL DEFAULT '',

`primaltplname` varchar(255) NOT NULL DEFAULT '',

`diycontent` mediumtext NOT NULL,

`name` varchar(255) NOT NULL DEFAULT '',

`uid` mediumint(8) unsigned NOT NULL DEFAULT '0',

`username` varchar(15) NOT NULL DEFAULT '',

`dateline` int(10) unsigned NOT NULL DEFAULT '0',

PRIMARY KEY (`targettplname`,`tpldirectory`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

再查看我们的执行报错SQL:

alter table pre_common_diy_data modify column targettplname varchar(255);

计算总长度:(80+255)*3=1005,已经超过了1000,所以出错。

解决的方法是减少字段的长度:

alter table pre_common_diy_data modify column targettplname varchar(240);

执行成功。

另外对于创建innodb的组合索引,也是有索引键长度长度限制的。

MySQL索引长度限制问题的更多相关文章

  1. MySQL 索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  2. Mysql索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  3. mysql索引长度

    http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能 ...

  4. MySQL索引长度限制

    索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...

  5. mysql 索引长度限制

    MyISAM存储引擎引键的长度综合不能超过1000字节 InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是3072

  6. mysql索引长度的一些限制

    一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version;+-------------------------------+| ...

  7. mysql 索引长度的限制

    myisam表,单列索引,最大长度不能超过 1000 bytes: innodb表,单列索引,最大长度不能超过 767 bytes: utf8 编码时   一个字符占三个字节 varchar  型能建 ...

  8. 【MySQL】索引长度的一些限制

    有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 ...

  9. 索引长度过长 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

    1.发现问题 今天在修改innodb表的某个列的长度时,报如下错误: alter table test2 modify column id varchar(500); ERROR 1071 (4200 ...

随机推荐

  1. Luci实现框架

    转自:http://www.cnblogs.com/zmkeil/archive/2013/05/14/3078774.html 1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作 ...

  2. C,C++经典问题

    C,C++经典问题   1 编程基础 1.1 基本概念 1.1.1 指针的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. ...

  3. linux:ls、ls -l、ls -al区别 示例

    linux:ls.ls -l.ls -al区别 示例 比如test文件夹下有一个test文件.一个.文件夹.一个..文件夹. 则,执行三个命令后,显示效果如下: [root@linuxserver t ...

  4. springmvc实现简单的拦截器

    SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方 ...

  5. nginx搭建前端项目web服务器以及利用反向代理调试远程后台接口

    前端同学用nginx搭建自己的web服务器,后台程序专门部署在一台服务器上(我们之前公司就有三套环境,开发/测试/生产),这样做的好处是 1.前端代码基本都是静态文件,重启一次很快,也就几秒钟时间. ...

  6. jQuery选择器的灵活用法

    // 摘自: http://hi.baidu.com/274084093/item/47a4ce696e89e534ad3e836b jQuery中选择器很强大,可以根据元素名称.ID.class等多 ...

  7. 获取web.py上面的示例code

    import requests import re import os.path #取得文件名和内容对应字典 def getCode(url): pattern=re.compile(r'<h\ ...

  8. 如何使用 awk 按模式筛选文本或字符串

    在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行.使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能 ...

  9. mysql多实例介绍及配置

    mysql多实例介绍及配置 1.mysql多实例介绍 1.1 什么是mysql多实例 mysql多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过 ...

  10. 【MVC5】使用域用户登录+记住我

    1.配置Web.config文件 添加域链接字符串 <connectionStrings> <add name="ADConnectionString" conn ...