首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用cx-Oracle插入Unicode

无法使用cx-Oracle插入Unicode
EN

Stack Overflow用户
提问于 2013-01-09 15:35:55
回答 1查看 8.1K关注 0票数 18

我在将unicode插入Oracle模式时遇到了问题,我认为数据库是一个Oracle 11g实例,但目前还不确定。我在OSX10.6.8上使用python2.6.1(这是python的系统版本),并且使用从sourceforge.net下载的cx驱动程序模块5.1版本,构建并安装到一个具有站点包可见的虚拟1.6.1实例中。我的脚本如下

代码语言:javascript
复制
  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语句并执行该语句,结果是这个错误。

代码语言:javascript
复制
  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的正确值,并在创建连接之前设置新值。

代码语言:javascript
复制
  os.environ["NLS_LANG"] = "AL32UTF8"
  connection = cx_Oracle.connect(
      "<user>/<password>@<host>/<service-name>"
      )
  cursor = connection.cursor()
  ...

但我明白这个错误。

代码语言:javascript
复制
  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小组之前,我想更好地了解这个问题是什么。

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-04 05:49:34

设置环境变量是正确的方法,但"AL32UTF8“不是NLS_LANG的正确值。要获得在Oracle实例中使用的NLS_LANG的正确值,请执行

代码语言:javascript
复制
SELECT USERENV ('language') FROM DUAL  
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14238824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档