jaydebeapi text类型无法读取问题解决记录
最近使用jdbc连接数据库,发现数据库后台是text类型数据无法读取的,直接打印显示:
<java object 'XXX.nds.jdbc.driver.NdsClob'>
一开始认为是不是jaydebeapi这个库本身的问题,后来认为一般不会是源码有问题就放弃了这种思路。
然后使用如下思路解决了这个问题:
使用dir
查看<>java的clob类有哪些属性和方法:
观察发现这个方法最有可能包含信息:
根据字面解释试了该方法,因为名称是stream
方法,一般是使用read
取字符,read只调用一次发现对应数据库空行的位置显示*-1*,有值的地方显示数据,于是估计是Unicode
编码,随后使用循环获得Unicode编码并且使用chr()
进行翻译,完整翻译后果然获得了数据。
完整代码如下:
conn = jaydebeapi.connect(driver, url, [user, password],jars=jarFile)
curs = conn.cursor()
curs.execute(sqlStr)
result = curs.fetchall()
curs.close()
print(len(result))
test_data=result[0]
print(test_data)
for i,tag in enumerate(test_data):
if 'NdsClob' in str(type(tag)):
#思路:使用dir查看<>java的clob类有哪些属性,根据字面解释试出一个方法,因为是stream方法,一般是使用read取字符,read只调用一次发现对应数据库空行的位置显示-1,有值的地方显示数据,于是估计是Unicode编码,随后使用循环获得Unicode编码并且使用chr()进行翻译
stream = tag.getCharacterStream()
string = ''
while True:
jint=stream.read()
if jint==-1:
break
string +=chr(jint)#使用流的方式进行读取,-1代码流结束了,然后使用chr()进行Unicode翻译
print(i,"---"+string)
else:
print(i,"---"+str(tag))