Django pyodbc Latin1_General_CI_AI编码

时间:2014-07-25 17:54:51

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

我有一个django应用程序使用pyodbc与一个带有Latin1_General_CI_AI编码的MS SQL Server数据库交谈。 (我无法控制此数据库,无法更改编码。)

问题是每个字符串都来自Django - > pyodbc必须编码:

例如:

m = MyModel()
m.foo = 'foo' # Garbage characters are saved
m.foo = 'foo'.encode('latin1') # String is saved correctly
m.save()

第二个问题是查询字符串也需要编码:

MyModel.objects.get(name=name) # fails
MyModel.objects.get(name=name.encode('latin1')) # works

我能用更通用的方式处理吗?模型mixin或DB后端?我在Django的SQLC编译器中看到了一些地方,但不知道如何影响它。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的事情,并采取了类似的解决方法。

对我来说,添加连接参数ClientCharset=utf8可以解决问题。如果像我一样使用django-pyodbc,则意味着添加: 'OPTIONS': { 'extra_params': 'ClientCharset=utf8', } 到您的数据库配置设置。如果你直接使用pyodbc,那么你可以将它添加到你的连接字符串。

这里的技巧(据我所知)是你的TDS驱动程序已经尝试从源数据库转换为适合客户端读取的默认编码。因为我们在这里谈论微软,所以适当的默认值是ISO 8859-1(不记得这是否完全是Latin-1,或者它是否如此接近以至于人们不会注意到差异)。这就是你的解决方法有效的原因。有关详情,请参阅here

Django期望数据库为talking utf-8,所以我们在这里所做的就是告诉TDS驱动程序我们想听到什么。