对于落库的时候字段超长,两种解决方法:
- 数据库字段扩展
- 落库信息截取
如果信息不是特别重要,比如日志这种信息就没必要给数据库扩展了。最近做了一个小优化,就是给超长的字段做截取落库,避免mybatis报错,这个字段我们数据库定义为255个字符。 substring应该是想到最直接的方法了,我脑海中的代码大概是这样子的(事实证明他实际也是这样的。
public static void main(String[] args) {
String a = "\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219\\u89c4\\u5219";
System.out.println(a);
if (a.length() > 255) {
System.out.println(a.substring(0, 255));
} else {
System.out.println(a);
}
}
首先我把一个超长的字段直接写库,发现可以直接落库,并对我的超长字段自动做了截取,这里就不追究是可视化工具还是mysql的版本可能导致会自动截取了,感兴趣的同学可以启动一下本地的数据库试一下。 但是在测试的时候发现,直接落库的数据长度和我用以上代码截取过后的长度不一样。中间过程省略,直接将结论,因为我们落库的数据为unicode编码,我在复制string到idea中测试上述代码的时候idea会自动帮我增加转译符,注意到这个以后稍作处理结果就正常了。 还需要注意的一点就是,mybatis可能会因为版本的不同,导致截取255的长度,自动增加一些数据(待考证),所以如果一定要增大到255的话(数据库的字段最大长度),一定要先经过本地的测试。 总结:
- 虽然代码很简单,还是需要自测
- 要注意特殊的值和符号,例如转译符
最后推荐两个在这个过程中我用到的python方法:
def rawUnicode():
s1 = '\u54c8'
# 可直接统计uni解码之后的str长度
print(len(s1))
# 如何用python得到uni编码
s2 = '哈'
ss = s2.encode('raw_unicode_escape')
sss = ss.decode()
print(sss)
rawUnicode()
|