这是一篇可能稍微有点复杂的针对数据库数据查询的解决方法,做好准备。
从数据库获取数据步骤如下
#直接执行无效,从数据库获取数据如下
conn=cx_Oracle.connect #第一步:连接数据库
cursor=conn.cursor()#第二步:定义游标
cursor.execute()#第三步:执行语句
data=cursor.fetchall()#第四步:获取数据
数据库为oracle,数据库很老很原始,英文和数字能读出来,中文就乱码
【走过的弯路】
一、NLS_LANG设置
数据库中查询字符集状态
select * from nls_database_parameters;
接着挨个凑环境变量
os.environ['NLS_LANG']=
我的电脑中的环境变量NLS_LANG和程序中os.environ的环境变量,试过(SIMPLIFIED CHINESE_CHINA,AMERICAN_AMERICA.)(UTF8,AL32UTF8,US7ASCII,AL16UTF16等等),你想到的我应该都试了,还是不行,要么提醒codec can't decode报错无法获取数据,要么获取到的数据就是乱码问号?
二、cx_Oracle.connect
该函数中的encoding和nencoding设置也试了好多,ascii,UTF-8,UTF-16,iso-8859-1等等,与上面的环境变量组合排列结果还是一样,要么报错读不出来,要么能读就是乱码
【解决办法,简单粗暴】
比如select name from user;在程序读取出来乱码,先用plsql执行语句,看得到什么中文字符,比如我得到中心,在http://www.mytju.com/classcode/tools/encode_gb2312.asp网址中输入中心会得到该字符的各种编码方式如图
接着再在sql语句上着手,python程序中将第三步的sql语句由中文转化为十六进制,尝试select rawtohex(name) from user;程序数据读取到字符串D6D0D0C4,根据这个码去找上图的编码方式,发现他是GBK编码16进制,我们试着将该字符decode,encode一下均得不到中文字符如下。
我们试着将其转化为二进制并加上\x
ok,成功一半,得到了中文,那有直接中文转化为上述格式的sql语句吗?有,将其改为select utl_raw.cast_to_raw(name) from user;即可
ok,该函数在python中为我们直接得到的二进制字符,且为\xd6的格式,我们直接在其后面.decode('gbk')即可得到中文字符。