基于python访问oracle数据库利用select提取数据遇到的坑。
1、DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded:
解决办法:参考该博客下载instantclientx64_jb51.rar,并配置好环境变量即可。
https://blog.csdn.net/white_xuqin/article/details/82878860
2、访问中文数据库,显示乱码,具体表现为中文变为"?"和十六进制为"3F"
解决办法:数据库数据转换函数select rawtohex(utl_raw.cast_to_raw('aaa123')) from dual、binascii.unhexlify()、"字符串".decode('utf-8')解决,该模式可以提取出数据库中的中英文字符与python程序写进去的英文字符与数字
https://www.cnblogs.com/Aiolos/p/12336379.html
3、较为棘手的问题rawtohex(utl_raw.cast_to_raw())与binascii.unhexlify()解决不了由程序引进的中文字符,如再程序中写得sql语句为select rawtohex(utl_raw.cast_to_raw('呵呵')) from dual,再经过binascii.unhexlify()与decode仍会显示"???",查询网上的资料,大致原因可能是因为python3有一套字符编码方式,我的Oracle数据库版本较老,采用的字符集编码为US7ASCII,英文与数据不冲突,但中文两个编码集存在冲突,所以老编码放在新的编码集中就出现了"???"
https://www.cnblogs.com/Gaoqiking/p/10455283.html
解决办法:rawtohex(utl_raw.cast_to_raw())是将字符转换为十六进制,只有再sql语句编写的时候先将中文字段通过
'中文'.encode('utf-8').hex() 编码为十六进制,通过"select '%s' from dual"%(该字段)的方式将该十六进制带到程序中,其余处理同上。