我有一个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编译器中看到了一些地方,但不知道如何影响它。
答案 0 :(得分:0)
我遇到了类似的事情,并采取了类似的解决方法。
对我来说,添加连接参数ClientCharset=utf8
可以解决问题。如果像我一样使用django-pyodbc
,则意味着添加:
'OPTIONS': {
'extra_params': 'ClientCharset=utf8',
}
到您的数据库配置设置。如果你直接使用pyodbc,那么你可以将它添加到你的连接字符串。
这里的技巧(据我所知)是你的TDS驱动程序已经尝试从源数据库转换为适合客户端读取的默认编码。因为我们在这里谈论微软,所以适当的默认值是ISO 8859-1(不记得这是否完全是Latin-1,或者它是否如此接近以至于人们不会注意到差异)。这就是你的解决方法有效的原因。有关详情,请参阅here。
Django期望数据库为talking utf-8,所以我们在这里所做的就是告诉TDS驱动程序我们想听到什么。