最近遇到了一个XX的需求,就是我用java从后端拿到最近数据同步到前台给PD用,PD只要GBK格式的。操作系统是win7,数据库是sqlite3。看起来很简单,分分钟的事情。
1.编码格式转换
prepareStatement.setString(1, new String("什么东西".getBytes("gbk"),"utf-8"));
public byte[] getBytes(Charset charset)使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
public String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
我发现在这里无论是如何进行转码,入库到sqlite,无一例外的全是乱码。
在控制台打印的是这么一堆东西。
库里面是这么一堆东西,结果没有一个是正确的。命令行的默认编码是936(gbk的),这样放到PB里面才是正确的。
我怀疑是不是编译环境编码不对,换成gbk,utf-8。都不好用。
我在本机搭了一个简易的PD环境,连库,检索。全乱码。
第一种方式不行。
2.修改jdbc驱动
刚开始是这个版本。看了下源码。
在prepareStatement.setString()这一步并不进行转码。
在excuteUpdate()才做了处理
也就是说无论你setString里面传的什么东西,通通不灵,全给你用utf-8转换到byte数组里面。
问题找到,修改重新打包。在自己运行,不行,乱码。放在别人机器上,解决。然后开始比对环境我32位,他64。好的。
到这里应该解决了吧。没有,线上说必须用32位的。
在改,下一步是不是就该改jdk的东西了。感觉蛋疼。这个路先不走了。换条路。
3.使用odbc驱动
也可以,不论jdk是64的还是32的,也不用关心jdbc驱动,而且现在做的项目是部在win7上。
但问题又来了,我这里面使用的是多线程读写操作。一直会报SQL LOGIC ERROR,然后就卡着不动了。在网上找了篇文章,才发现。Sqlite的锁机制。
在SQLite中,锁和事务是紧密联系的。为了有效地使用事务,需要了解一些关于如何加锁的知识。
SQLite采用粗放型的锁。当一个连接要写数据库,所有其它的连接被锁住,直到写连接结束了它的事务。SQLite有一个加锁表,来帮助不同的写数据库都能够在最后一刻再加锁,
以保证最大的并发性。