【问题标题】:Python pyodbc Unicode issuePython pyodbc Unicode问题
【发布时间】:2015-04-05 14:21:16
【问题描述】:

我有一个字符串变量 res,它是从 pyodbc 游标派生的,如底部所示。 表test 有一行数据ä,其unicode 代码点为u'\xe4'

我得到的结果是

>>> res,type(res)
('\xe4', <type 'str'>)

而我应该得到的结果是。

>>> res,type(res)
(u'\xe4', <type 'unicode'>)

我尝试将字符集作为 utf-8 添加到我的 pyodbc 连接字符串中,如下所示。 结果现在已正确设置为 unicode,但代码点是其他字符串 ,这可能是由于 pyodbc 驱动程序中可能存在的错误。

conn = pyodbc.connect(DSN='datbase;charset=utf8',ansi=True,autocommit=True)
>>> res,type(res)
(u'\ua4c3', <type 'unicode'>)

实际代码

import pyodbc
pyodbc.pooling=False
conn = pyodbc.connect(DSN='datbase',ansi=True,autocommit=True)
cursor = conn.cursor()
cur = cursor.execute('SELECT col1 from test')
res = cur.fetchall()[0][0]
print(res)

其他细节 数据库:Teradata pyodbc 版本:2.7

那么我现在该怎么做

1) 将('\xe4', &lt;type 'str'&gt;) 转换为(u'\xe4', &lt;type 'unicode'&gt;)(是否可以这样做而不会产生无意的副作用?)

2) 解决 pyodbc/unixodbc 问题

【问题讨论】:

    标签: python unicode utf-8 odbc pyodbc


    【解决方案1】:

    对于 Python 3,试试这个:

    conn = pyodbc.connect(DSN='datbase',ansi=True,autocommit=True)之后

    放置这个:

    conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf8') conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf8') conn.setencoding(encoding='utf8')

    conn.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') conn.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') conn.setencoding(encoding='iso-8859-1')

    等等……

    Python 2:

    cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') cnxn.setencoding(str, encoding='utf-8') cnxn.setencoding(unicode, encoding='utf-8')

    等等……

    cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='encode-foo-bar') cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='encode-foo-bar') cnxn.setencoding(str, encoding='encode-foo-bar') cnxn.setencoding(unicode, encoding='encode-foo-bar')

    【讨论】:

    • 感谢您发布与当前版本的 pyodbc(4.x 及更高版本)相关的更新。更多详情请访问pyodbc Wiki
    • 谢谢!这对我在 MacOS 上使用 Python3 和 MySQL ODBC 8.0 ANSI 驱动程序很有帮助。
    【解决方案2】:

    这是我认为最好用 Python 处理的事情,而不是摆弄pyodbc.connect 参数和驱动程序特定的连接字符串属性。

    '\xe4' 是一个 Latin-1 编码字符串,表示 unicode ä 字符。

    在 Python 2.7 中显式解码 pyodbc 结果:

    >>> res = '\xe4'
    >>> res.decode('latin1'), type(res.decode('latin1'))
    (u'\xe4', <type 'unicode'>)
    >>> print res.decode('latin1')
    ä
    

    Python 3.x 为您执行此操作(str type includes unicode characters):

    >>> res = '\xe4'
    >>> res, type(res)
    ('ä', <class 'str'>)
    >>> print(res)
    ä
    

    【讨论】:

    • 谢谢@Bryan 我今天会试试这个。
    • 感谢它按预期工作。但是我们的要求是也支持亚洲字符,所以我选择通过 jpype 使用 JDBC 的 JayDeBeApi。
    猜你喜欢
    • 2018-06-07
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多