今天在测试过程中程序报错:
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'cadbom_instance_id' at row 45
; SQL []; Data truncation: Data too long for column 'cadbom_instance_id' at row 45; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'cadbom_instance_id' at row 45
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
查看数据库cadbom_instance_id 字段的长度为varchar(255),用sql修改该字段的长度为500时报错:
Specified key was too long; max key length is 767 bytes;
系统变量innodb_large_prefix开启了,则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,不管是什么表,索引键前缀限制为767字节。
上述的bug很明显是索引超出了限制的长度767个字节!
上述的767是字节,而varchar类型是字符,同时我发现我使用的字符集为(utf8),这个指每个字符最大的字节数为3,所以很明显 3*500> 767。
解决方案:去除cadbom_instance_id字段的索引,然后在通过sql修改该字段的长度!