我正在将cx_Oracle v7.1.3与Python 3.6.4结合使用。我当前的Oracle数据库同时具有英语,日语和数字值。可以很好地检索英文和数字值,但是日语文本显示为'???'
。
我的第一个想法是必须对编码做一些事情,也许默认的ASCII会引起问题,所以我使用str.encode()尝试将日文字符串编码为UTF8,但无济于事。在打印它们时,它们仅显示b'????'
with open('get_table_names.sql', 'r') as file:
for line in file:
SQL_QUERY = str(line)
cursor.execute(SQL_QUERY)
# Inner cursor to read inner fields
new_cursor = connection.cursor()
for desc, table_name in cursor:
# print(cursor.description)
new_cursor.execute("SELECT * FROM {}".format(table_name.lower()))
with,open块仅从文件读取SQL查询。游标执行该操作,并检索所有要查询的表的名称,并且new_cursor用于读取每个表。
任何人和所有帮助将不胜感激。
答案 0 :(得分:1)
要么在启动Python之前用字符集设置NLS_LANG环境变量,要么(更容易)在连接时使用encoding
,请参见https://cx-oracle.readthedocs.io/en/latest/module.html#cx_Oracle.connect
使用类似的东西:
conn = cx_Oracle.connect("user/password@hostname/servicename", encoding="UTF-8", nencoding="UTF-8")
您可能需要其他编码。
答案 1 :(得分:1)
也许首先可以检查您的os字符集和DB字符集:
cursor.execute("""select 'DB: ' || value as db_charset from nls_database_parameters where parameter = 'NLS_CHARACTERSET'
union
select distinct 'Client: ' || client_charset from v$session_connect_info where sid = sys_context('USERENV', 'SID')""")
v = c.fetchall()
print(v)
这可以帮助您解决问题。
import os
os.environ["NLS_LANG"] = ".UTF8"