使用pyodbc / SQL Server进行不正确的字符集编码

时间:2014-12-21 20:06:38

标签: python django encoding pyodbc sql-server-2014

我正在使用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,我假设它是数据库的编码 - collat​​ion是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
        }
}

0 个答案:

没有答案