【问题标题】:Unicode utf-16/8 mess with pyodbcUnicode utf-16/8 与 pyodbc 混淆
【发布时间】:2016-07-18 08:35:40
【问题描述】:

我正在结合MS Access和Python 3.2.5使用pyodbc(恐怕我不知道是什么版本)。

ODBC 版本是 unixODBC 2.2.14,RHEL6 系统上的 mdb 驱动程序 msodbcsql-11.0.2270

现在最大的问题是,如果我尝试查询我的表,它会返回乱码。

例如,SELECT * FROM table 返回:

('ä¹ã', 'ã¶ã°ã°ã°ãµã°')

现在这本身不是什么大问题,我可以使用 Python 字符串自己的编码方法对其进行编码。

def _enc16(self, value):
        return value.encode('utf-16')[2::]

虽然我告诉 ODBC 驱动程序我想使用 utf-16(我认为这是 python 标准?)

摘自我的 odbc.ini:

[mdb]
Description = Microsoft Access
Driver = MDBToolsODBC
Database = /path/to/file.mdb
Servername = localhost
Charset = UTF16
PORT = 5432

现在问题就从这里开始了。如果我尝试使用 WHERE 子句查询表,它很可能无法将我的 Python 字符串与表内容进行比较,因为它们的编码方式不同。

所以SELECT * FROM table WHERE id = '1'返回None,即使有对应的记录(我把语句复制到Access中找到了记录)。

那么这里最好的方法是什么? 配置 ODBC 以便它返回正确的编码(如何?我已经摆弄了一段时间)或编码我的搜索条件(将“1”变成“ä¹ã”,但是如何?)?

感谢您的帮助!

【问题讨论】:

    标签: python-3.x ms-access unicode pyodbc unixodbc


    【解决方案1】:

    好的,所以我使用SELECT * FROM table 语句解决了它并将结果输入到列表列表中。 我对这个列表进行了简单的搜索,以过滤掉我正在寻找的唯一记录。我知道这有点乏味,但它确实有效。

    rows = [[b'' if value is None else self._enc16(value) for value in row] for row in cursor.fetchall()]
    
    for row in rows:
      for i, entry in enumerate(row):
        row[i] = str(self._dec8(entry))
      if row[0] == str(samplenr):
        break
    

    如您所见,我通过使用 UTF-16 对打乱的结果进行编码并将它们重新编码为 UTF-8 以便 Python 可以将其转换为可读字符串,从而解决了编码问题。

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2010-09-06
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2015-12-06
      • 2012-06-24
      相关资源
      最近更新 更多