精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-04
最后修改:2010-04-04
环境: mySql版本:6.0 , Engine=InnoDB ,charset = utf8
语句: create table JBPM4_EXECUTION (DBID_ bigint not null, CLASS_ varchar(255) not null, DBVERSION_ integer not null, ACTIVITYNAME_ varchar(255), PROCDEFID_ varchar(255), HASVARS_ bit, NAME_ varchar(255), KEY_ varchar(255), ID_ varchar(255) unique, STATE_ varchar(255), SUSPHISTSTATE_ varchar(255), PRIORITY_ integer, HISACTINST_ bigint, PARENT_ bigint, INSTANCE_ bigint, SUPEREXEC_ bigint, SUBPROCINST_ bigint, PARENT_IDX_ integer, primary key (DBID_))
错误: 17:14:37,805 SEV | [SchemaExport]:Specified key was too long; max key length is 767 bytes
资料: Cause The maximum key length for the MySQL database for InnoDB Engine is 767 bytes. The key length includes the sum lengths of all the columns included in the key. Solutions There are several solutions for this issue:
ALTER TABLE department ADD PRIMARY KEY (id, name(100)); In this example only 100 bytes of the NAME column participate in the primary key.
参考: http://www.ispirer.com/wiki/sqlways/troubleshooting-guide/mysql/import/key-too-long 也可以参考这个,了解一下引擎为myisam与innob的表对key最大长度的限制不一样: http://yubowei.blog.51cto.com/978243/223773
从上面我们知道引擎为innodb的Mysql的key最大长度为767bytes ,而在sql语句中我们这样设置的varchar(255),
1. 根据数据库字符编码: MySQL的varchar主键只支持不超过768个字节 或者 768/2=384个双字节 或者 768/3=256个三字节的字段 根据《xml开发技术教程》中的编码详解:utf-8是变长编码,对于7位基本ASCII字符,仅用1一个字节;而其他字符使用1-3个字节编码,这么说来urf-8最多为3个字节。 2. Mysql中数据类型varchar : String, length 0 - 255 “255*3=765<767” 我们看出varchar(255)所占的字节数肯定是没有超出最大长度的。 ==============================================================================至此告一段落
接下来需要对mysql中key的理解以及理解这句E文“The key length includes the sum lengths of all the columns included in the key.” 在mysql中culomn key有如下几种:uni , mul , pri 等。(http://hlbng.iteye.com/blog/382457) 这句E文说的意思为:最大长度为所有key的长度之和。
回到sql语句:其中有两种key:uni , pri ;一个为:primary key (DBID_) ,一个为ID_ varchar(255) unique 。 DBID_为bigint类型,bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),存储大小为 8 个字节。(http://blog.csdn.net/Ivanluc/archive/2010/01/11/5174468.aspx 及其 http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html) 于是就有:“(255*3+8)= 773 > 767” (原因所在:超过了最大长度)。
改成 “(252*3+8)= 764 < 767” (所想解决办法) create table JBPM4_EXECUTION (DBID_ bigint not null, CLASS_ varchar(255) not null, DBVERSION_ integer not null, ACTIVITYNAME_ varchar(255), PROCDEFID_ varchar(255), HASVARS_ bit, NAME_ varchar(255), KEY_ varchar(255), ID_ varchar(252) unique, STATE_ varchar(255), SUSPHISTSTATE_ varchar(255), PRIORITY_ integer, HISACTINST_ bigint, PARENT_ bigint, INSTANCE_ bigint, SUPEREXEC_ bigint, SUBPROCINST_ bigint, PARENT_IDX_ integer, primary key (DBID_)); 错误:Specified key was too long; max key length is 767 bytes
反复查看这条sql语句,key只有这两个。 极限修改:将“ID_ varchar(252) unique” 改成 “ID_ varchar(20) unique” 成功。
=========“(252*3+8)= 764 < 767” 这个修改应该可以的========
兵临城下,解决问题再说,更改表的Engine:InnoDB –> myisam Set strorage_engine = myisam ; 存储引擎为myisam不支持事务管理。(http://taito.iteye.com/blog/314919) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-06
引用 更改表的Engine:InnoDB –> myisam
至于这点补充一下(高手略过): ========================= 修改数据库的Storage Engine方法: ========================= 更改mysql安装目录(如:C:\Program Files\MySQL\MySQL Server 6.0)下my.ini文件,找到如下一行: default-storage-engine=InnoDB 更改为: default-storage-engine=MyISAM ========================== 重启mysql(使修改配置文件生效) 停止MYSQL服务 net stop mysql 启动MYSQL服务 net start mysql ========================== 查看默认的存储引擎(及其可用引擎) show engines ========================== 测试jbpm demo 的examples,成功! Console: 01:14:10,456 INF | [SchemaExport] exporting generated schema to database 01:14:27,796 INF | [SchemaExport] schema export complete |
|
返回顶楼 | |
浏览 5097 次