今天遇到一个情况,GORM 根据 class 自动建表失败,且没有任何提示信息。
造成建表失败的原因是 varchar 类型字段的 maxSize*3 超过了 mysql varchar 字段最大字节数。
为什么要乘以3呢?因为 mysql 类型长度是按字节算,而varchar长度是按字符算的,所以 varchar(1) 实际占用的字节长度是3(如果数据库编码是 utf-8 的话)。
因为 mysql varchar 最大字节长度是 65535,因此 varchar 最大字符长度是 65535/3 = 21845。
造成错误的代码:
class Trade {
String orderString
static constraints = {
orderString maxSize: 1024*10
}
}
这估计是 GORM 的一个bug,因为按照文档,GORM 应该自动调整 orderString 的 mapping,变成 text sql 类型的字段才对。
我们需要给 grails 提一个 bug issue。
解决办法:
- 指定 column 的 sqlType: “text” 即可
class Trade {
String orderString
static mapping = {
orderString sqlType: "text"
}
static constraints = {
orderString maxSize: 1024*10
}
}