我在将unicode插入Oracle模式时遇到了问题,我认为数据库是一个Oracle 11g实例,但目前还不确定。我在OSX10.6.8上使用python2.6.1(这是python的系统版本),并且使用从sourceforge.net下载的cx驱动程序模块5.1版本,构建并安装到一个具有站点包可见的虚拟1.6.1实例中。我的脚本如下
import cx_Oracle
connection = cx_Oracle.connect(
"<name>/<password>@<host>/<service-name>"
)
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)我创建了一个连接,创建了游标,执行了一个状态来创建一个包含id和文本字段的测试表,类型为NCLOB。我打开一个文件,其中包含用UTF-8编码的文本,将字符串解码为unicode。在unicode字符串中创建一个insert语句并执行该语句,结果是这个错误。
Traceback (most recent call last):
File "unicode-test.py", line 19, in <module>
result = cursor.execute(statement)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 170: ordinal not in range(128)在将我的语句插入Oracle架构之前,有东西试图将其编码为ASCII。因此,我开始四处寻找,以更好地了解cx-Oracle如何处理unicode,并在我从sourceforge.net下载的cx-Oracle源代码的sourceforge.net中找到了这一点。
从5.0.4改为5.1 1)删除对UNICODE模式的支持,允许在任何地方传递Unicode -可以传入字符串。这意味着字符串也将使用Python3.x中的NLS_LANG环境变量的值传递给Oracle。这样做消除了使用UNICODE模式发现的一系列问题,还消除了Python2.x中的一个不必要的限制,即Unicode不能用于连接字符串或SQL语句。..。
我的假设是,NLS_LANG环境变量被设置为'ascii‘或一些等效变量,因此我尝试将NLS_LANG设置为'AL32UTF8’,我认为这是unicode的正确值,并在创建连接之前设置新值。
os.environ["NLS_LANG"] = "AL32UTF8"
connection = cx_Oracle.connect(
"<user>/<password>@<host>/<service-name>"
)
cursor = connection.cursor()
...但我明白这个错误。
Traceback (most recent call last):
File "unicode-test.py", line 11, in <module>
"<user>/<password>@<host>/<service-name>"
cx_Oracle.DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified所以看起来我不能篡改NLS_LANG值。
这是我现在的问题。我是不是遗漏了一些简单的东西,比如不正确的列类型?驱动程序有问题吗?在构建cx模块时,我需要设置"WITH_UNICODE“环境变量吗?Oracle实例存在问题吗?我几乎没有使用Oracle的经验,也从未一起使用过Oracle和python。我在这个问题上花了两天时间,在我去DBA小组之前,我想更好地了解这个问题是什么。
谢谢,
发布于 2013-04-04 05:49:34
设置环境变量是正确的方法,但"AL32UTF8“不是NLS_LANG的正确值。要获得在Oracle实例中使用的NLS_LANG的正确值,请执行
SELECT USERENV ('language') FROM DUAL https://stackoverflow.com/questions/14238824
复制相似问题