Найти - Пользователи
Полная версия: cx_Oracle и русские символы
Начало » Базы данных » cx_Oracle и русские символы
1
sonniy
в БД кодировка :
NLS_CHARACTERSET = AL32UTF8

но cx_Oracle выдает
>>> conn.encoding
'US-ASCII'
и соответственно все ложится квадратиками в БД
как это можно исправить ?
agalen
Попробуй задать NLS_LANG=American_America.AL32UTF8
sonniy
если задать неверный NLS то вы даже не законектитесь в Oracle

я вышел из положения следующим образом :
# -*- coding: utf-8 -*-
import cx_Oracle

login = ''
passwd = ''
ip = ''
port_ora = ''
bd = ''

try:
connstr = login+'/'+passwd+'@'+ip+':'+port_ora+'/'+bd
conn = cx_Oracle.connect(connstr)
cursor = conn.cursor()
except Exception, e:
print e

def to_ora_unistr(self):
tou = self.encode('unicode_escape').replace('\\u','\\')
return tou

orderno = 123465
comments = to_ora_unistr('Русская стринга')

cursor.execute('''INSERT INTO orders (orderno,comments)
VALUES (:orderno,unistr(:comments))''',
{
'orderno' : orderno,
'comments' : comments,
}
)
conn.commit()
делал через функцию так как часто используется в разных местах и не забываем commit() в конце

PS
Прошу прощения, оказалось что ваша наводка очень даже кстате :
agalen
Попробуй задать NLS_LANG=American_America.AL32UTF8
после нее:
>>> conn.encoding
'UTF-8'
видимо я гдето допустил ошибку в написании “American_America” когда пробовал такой метод
tfox
agalen
Попробуй задать NLS_LANG=American_America.AL32UTF8

Где задается этот параметр? Как его задать?
Спасибо.
ziro
Где задается этот параметр? Как его задать?

ЕМНИП традиционно оракл берет его из переменных окружения.

Так что способов 2:
1. Задать переменную окружения для вашей ОС с именем NLS_LANG
2. Внутри питона установить
 os.environ['NLS_LANG'] = '...'
Как минимум до коннекта к БД. А возможно и до строки “import cx_Oracle”.
tfox
Получилось

import os
os.environ['NLS_LANG'] = 'American_America.AL32UTF8'
quickes
#!/usr/bin/env python
#-*-coding:utf8-*-
import os
os.environ["NLS_LANG"] = "Russian.AL32UTF8"
#подключение
    def dbopen(self):
        try:
            tns = cx_Oracle.makedsn("oracle.ххх.ru",1521,"jdedb")
            print tns
            self.ora = cx_Oracle.connect('%s/%s@%s'%(self.dbuser,self.dbpwd,tns))
            self.db = self.ora
        except Exception,e:
            raise RuntimeError,e.message
        return 1
# уже при выполнении вставки
        sql = u"insert into %(table)s (%(fields)s) values (%(values)s)"%{"table":self.chema+'.'+self.table,"fields":fields,"values":values}
        cur = db.cursor()
        try:
            cur.execute(sql.encode("cp1251"))
        except Exception,e:
            print e.__str__()
            print sql.encode("cp1251")
            raise e
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB