Невозможно вставить Unicode, используя cx-Oracle

У меня возникла проблема со вставкой юникода в схему Oracle, я думаю, что база данных - это экземпляр Oracle 11g, но на данный момент я не уверен. Я'Я использую python 2.6.1 в OS X 10.6.8 (это системная версия python) и использую модуль драйвера cx-Oracle версии 5.1, скачанный с sourceforge.net, собранный и установленный в экземпляр virtualenv 1.6.1 с сайтом пакеты видны. Мой сценарий выглядит следующим образом

  import cx_Oracle

  connection = cx_Oracle.connect(
      "/@/"
      )
  cursor = connection.cursor()
  result = cursor.execute(u"create table UNICODE_TEST (id NUMBER(6), text NCLOB not NULL)")

  raw_text = open("test.txt",'r').read()
  if isinstance(raw_text,str):
      raw_text = raw_text.decode("utf_8")

  statement = u"insert into UNICODE_TEST (id, text) values (1,'%s')" % raw_text
  result = cursor.execute(statement)

Я создаю соединение, создаю курсор, выполняю статистику, чтобы создать тестовую таблицу с идентификатором и текстовым полем типов NUMBER и NCLOB. Я открываю файл, содержащий то, что я знаю, как текст, закодированный в UTF-8, декодирую строку в Unicode. Создайте вставку в строку Юникода и выполните эту инструкцию, и в результате вы получите эту ошибку.

  Traceback (most recent call last):
    File "unicode-test.py", line 19, in 
      result = cursor.execute(statement)
  UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 170: ordinal not in range(128)

Что-то пытается закодировать мой оператор как ASCII, прежде чем вставить его в схему Oracle. Поэтому я начал искать, чтобы лучше понять, как cx-Oracle обрабатывает юникод, и нашел это в HISTORY.txt исходного кода cx-Oracle, который я скачал с sourceforge.net

Изменения с 5.0.4 до 5.1

1) Удалите поддержку режима UNICODE и разрешите пропуск Unicode везде, где может быть передана строка. Это означает, что строки будут передаваться в Oracle, используя значение переменной среды NLS_LANG в Python 3.x. Это позволило устранить кучу проблем, которые были обнаружены с использованием режима UNICODE, а также сняло ненужное ограничение в Python 2.x, что Unicode нельзя использовать, например, в строках соединения или инструкциях SQL. ...

Я предполагаю, что переменная среды NLS_LANG установлена в 'ASCII» или какой-то эквивалент, поэтому я пытаюсь установить NLS_LANG в 'AL32UTF8' Я считаю, что это правильное значение для Unicode, и установите новое значение перед созданием моего соединения.

  os.environ["NLS_LANG"] = "AL32UTF8"
  connection = cx_Oracle.connect(
      "/@/"
      )
  cursor = connection.cursor()
  ...

Но я получаю эту ошибку.

  Traceback (most recent call last):
    File "unicode-test.py", line 11, in 
      "/@/"
  cx_Oracle.DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified

Похоже, я не могу подделать значение NLS_LANG.

Вот мои вопросы на данный момент. Я пропускаю что-то простое, например, неверный тип столбца? Проблема с драйвером cx-Oracle? Нужно ли устанавливать "WITH_UNICODE» переменная окружения при сборке модуля cx-Oracle и как мне это сделать? Проблема с экземпляром Oracle? У меня мало опыта работы с Oracle, и я никогда не работал вместе с Oracle и python. Я'Мы потратили два дня на работу над этой проблемой и хотели бы лучше понять ее, прежде чем перейти в группу DBA.

Спасибо,

Ответы на вопрос(1)

Ваш ответ на вопрос