【发布时间】: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.ini 和odbcinst.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