使用cx_Oracle在查询Oracle DB时日语字符显示为问号

时间:2019-06-19 08:40:41

标签: python-3.x oracle cx-oracle

我正在将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用于读取每个表。

任何人和所有帮助将不胜感激。

2 个答案:

答案 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"