【发布时间】:2021-06-21 10:48:08
【问题描述】:
我正在尝试通过 Python 2 (Flask) API 从 Python 3 (Django) 应用程序中获取特殊字符(例如:ñ、ü、é)并进入 Oracle 数据库(Oracle 19c Enterprise)。这取代了可以直接访问数据库并能够毫无问题地保存特殊字符的 Java 应用程序。
为了使用特殊字符进行 API 调用,我发现我必须对值进行 URL 编码:
>>> comment = "Joëlle Küsel Núñez-Chaillüé"
>>> urllib.parse.quote(comment).encode('utf-8')
b'Jo%C3%ABlle%20K%C3%BCsel%20N%C3%BA%C3%B1ez-Chaillu%CC%88%C3%A9'
该字符串被发送到 Python 2 API。我最初的尝试涉及在将其发送到 Oracle 之前在 Python 2 中对其进行解码,但是,任何将值传递给 cx_Oracle 的尝试都会导致 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)
我试图通过简单地将 URL 编码的字符串直接传递给 Oracle 来解决它:
>>> comment_blob = cx.cursor().var(cx_Oracle.BLOB)
>>> comment_blob.setvalue(0, bytes(u'{}'.format(comment.decode('utf-8'))))
在 Oracle 中,我尝试解码该值:
v_comment := UTL_RAW.CAST_TO_VARCHAR2( parameter );
v_comment := convert(utl_url.unescape(v_comment), 'WE8ISO8859P15');
这适用于除 ü 之外的所有内容,在某些情况下会被其后的字符覆盖(但在粘贴到任何其他文本编辑器时正确显示),有时会更改为完全不同的字符。例如:
Joëlle Küsel Núñez-Chaillüé
Joëlle Kÿsel Núñez-Chaillüé
字符 9 从 ü 更改为 ÿ,虽然最后两个字符在这里看起来正确,但在 SQL Developer 中,它们被组合成一个字符(通过旧 Java 应用插入的值在 SQL Developer 中正确显示)。
任何想法为什么我只有 ü 字符有问题?
【问题讨论】:
标签: python oracle plsql special-characters cx-oracle