Японские символы отображаются в виде вопросительных знаков при запросе к базе данных Oracle с использованием cx_Oracle - PullRequest
0 голосов
/ 19 июня 2019

Я использую 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 ]

1 голос
/ 19 июня 2019

возможно, сначала вы можете проверить свой набор символов 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"
1 голос
/ 19 июня 2019

Либо установите переменную среды NLS_LANG с вашим набором символов перед запуском Python, либо (проще) используйте 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")

Возможно, вам нужна другая кодировка.

...