【问题标题】:String encoding issue with pyodbc's returned datapyodbc 返回数据的字符串编码问题
【发布时间】:2016-11-07 06:29:44
【问题描述】:

在使用 PyODBC 进行查询时,我的表数据如下:

 u'\u3836\u3431\u3132\u3230\u3030'

我的数据库列中的实际内容为:

 6814210200

当我将 pyodbc 的返回值显式编码为 utf-16 时,我得到的内容为(最接近的):

>>> print d['data'][0]['upc'].encode('utf-16')
 ��6814210200
#^^ two junks

我的问题是:如何直接从 PyODBC 查询中获取编码值?

我的数据库连接字符串中已经将CHARSET=UTF16 设置为:

pyodbc.connect("DRIVER=<driver_name>;" + \
                                 "SERVER=<server_ip>;" +\
                                 "DATABASE=<database>;" +\
                                 "UID=<user>;" +\
                                 "PWD=<password>;" + \
                                 "CHARSET=UTF16",    # setting charset
                                 ansi=True)

在我所有的odbc.iniodbcinst.ini 文件中,我都设置了:

 UnicodeTranslationOption = utf16 
 CharacterTranslationOption = all

在我的驱动程序设置下。

【问题讨论】:

  • 您使用 UTF-16 有什么特殊原因吗?这不是很常见,在 Linux 系统上几乎闻所未闻。如果你设置"CHARSET=UTF8"会发生什么?
  • 我不知道它是否与您的特定情况有关(而且我对 PyODBC 一无所知),但本文中有很多关于 Unicode(适用于 Python 2 和 Python 3)的好信息:Pragmatic Unicode,由 SO 老将 Ned Batchelder 编写。
  • @PM2Ring "CHARSET=UTF8" 也返回相同的结果。使用UTF-16 的原因是我正在使用基于 UTF-16 编解码器的 Nettezza 的数据库驱动程序。感谢分享这篇文章,我觉得它很有趣。会看看。
  • 那里不需要使用反斜杠!即使字符串是常量,也无需使用 +。您的数据似乎不是 UTF-16 - 当您使用 CHARSET=UTF8 时,您实际上得到了什么 - 请添加该值的未修改的 repr
  • @AnttiHaapala:我在实际代码中的每一行都使用.format(),这就是使用“+ \”的原因。我给出的 O/P 是repr() 的内容为u'\u3836\u3431\u3132\u3230\u3030',没有repr,它打印㠶㐱ㄲ㈰〰(中文中的东西(看起来像mandrin))。而且,如果我用连接字符串提及CHARSET=UTF8,我会得到相同的内容

标签: python encoding ubuntu-14.04 pyodbc string-decoding


【解决方案1】:

您需要指定您需要little endian 版本的UTF-16。

s = u'\u3836\u3431\u3132\u3230\u3030'
print s.encode('utf-16le')

输出

6814210200

FWIW,在 Python 3 中,s.encode('utf-16le') 返回 b'6814210200'

【讨论】:

  • 我不想显式编码 PyODBC 查询返回的每一行和每一列的值。我正在寻找在 PyODBC 配置/连接字符串中指定编码的选项,该字符串隐式处理编码部分。明确地这样做将是巨大的开销。无论如何,+1 作为我在问题后面添加的 PyODBC 查询部分。
  • 在这种情况下,您可能需要在数据库级别进行整理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多