sqlite编码问题

本文讲述了在处理SQLite数据库时遇到的编码问题,包括GBK与UTF-8转换导致的乱码问题,以及SQLite的事务和锁机制。作者通过分析jdbc驱动的编码处理,发现需要在特定环境下才能解决问题。同时,文章讨论了SQLite的锁升级机制,读写事务的处理,以及如何避免并发读写时的SQL LOGIC ERROR。最后,作者因并发问题改为单线程操作。
摘要由CSDN通过智能技术生成

 最近遇到了一个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里面才是正确的。




我怀疑是不是编译环境编码不对,换成gbkutf-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有一个加锁表,来帮助不同的写数据库都能够在最后一刻再加锁, 
以保证最大的并发性。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值