我正在使用pyodbc从python访问SQL Server 2014数据库。问题是多字节unicode字符作为单字节字符传输到数据库,然后由同一个驱动程序返回为两个unicode字符。我跟进了一个具体的例子:
def print_hex(s):
print ":".join("{:02x}".format(ord(c)) for c in s)
def test_insert_unicode():
u = User(username=u'\u00fc')
print_hex(u.username)
u.save()
print_hex(User.objects.get(id=u.id).username)
并产生以下输出
<type 'unicode'> fc
<type 'unicode'> c3:bc
由于c3和bc是对应于u&#39; \ u00fc&#39;的utf-8编码的字节,我假设发生的事情是在发送到字符串时将其编码为utf-8数据库(而不是cp1252,我假设它是数据库的编码 - collation是latin1),然后,当返回时,这两个字节都被解释为一个字符(因为cp1252是一个字符)编码)。对数据库中插入的值的选择确实返回与cp1252中的代码点c3和bc对应的两个字符。
数据库访问是在python 2.7上通过pyodbc-3.0.7完成的。数据库是在Windows 8.1上运行的SQL Server 2014,并且使用SQL Native Client 11.0设置odbc连接。当“翻译”字符数据时,同样的事情也会发生。设置数据源的选项,当它不是时。 感谢
PS。我对数据库的设置如下,但我不能确定Django从中生成什么连接字符串:
'rx3_mssql': {
'ENGINE': 'django_pyodbc',
'NAME': 'rx3', # Or path to database file if using sqlite3.
'USER': 'rx3', # Not used with sqlite3.
'PASSWORD': 'rx3', # Not used with sqlite3.
'OPTIONS' : {
'encoding':'utf-8',
'dsn' : 'mssql-rx3',
'autocommit' : True,
'MARS_Connection' : True
}
}