Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2012 09:36:16

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

в БД кодировка :
NLS_CHARACTERSET = AL32UTF8

но cx_Oracle выдает

>>> conn.encoding
'US-ASCII'
и соответственно все ложится квадратиками в БД
как это можно исправить ?



Офлайн

#2 Фев. 27, 2012 12:31:10

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

Попробуй задать NLS_LANG=American_America.AL32UTF8



Офлайн

#3 Фев. 29, 2012 05:06:44

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

если задать неверный 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” когда пробовал такой метод



Отредактировано (Фев. 29, 2012 08:12:08)

Офлайн

#4 Авг. 16, 2012 10:23:37

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

agalen
Попробуй задать NLS_LANG=American_America.AL32UTF8

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

Офлайн

#5 Авг. 16, 2012 11:41:39

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

Где задается этот параметр? Как его задать?

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

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



Отредактировано ziro (Авг. 16, 2012 11:52:42)

Офлайн

#6 Авг. 16, 2012 12:59:12

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

Получилось

import os
os.environ['NLS_LANG'] = 'American_America.AL32UTF8'

Офлайн

#7 Авг. 24, 2012 16:45:23

quickes
Зарегистрирован: 2012-08-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Oracle и русские символы

#!/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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version