我有一个使用pyodbc的django应用程序来与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有没有更通用的方法来处理这个问题?是Model mixin还是DB后端?我在姜戈的SQLCompiler中看到了一些地方,但不确定如何影响它。
发布于 2014-12-12 05:41:40
我正在经历类似的事情,并且有一个类似的变通方法。
对我来说,添加连接参数ClientCharset=utf8解决了这个问题。如果像我一样使用django-pyodbc,这意味着在数据库配置设置中添加:'OPTIONS': { 'extra_params': 'ClientCharset=utf8', }。如果您直接使用pyodbc,那么您可以将其添加到您的连接字符串中。
这里的诀窍(据我所知)是,您的TDS驱动程序已经在尝试将源数据库转换为适当的默认编码,以便您的客户端读取。因为我们在这里讨论的是微软,所以一个合适的默认值是ISO 8859-1 (我不记得这是不是确切的拉丁文-1,或者只是太接近了以至于人们不太容易注意到区别)。这就是你的变通方法起作用的原因。有关详细信息,请参阅here。
Django期望数据库是talking utf-8的,所以我们在这里要做的就是告诉TDS驱动程序我们想要听到的信息。
https://stackoverflow.com/questions/24961773
复制相似问题