【问题标题】:Django pyodbc Latin1_General_CI_AI encodingDjango pyodbc Latin1_General_CI_AI 编码
【发布时间】:2014-07-25 17:54:50
【问题描述】:

我有一个 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

有没有更通用的方法可以处理这个问题?模型混合或数据库后端?我在 Django 的 SQLCompiler 中看到了一些地方,但不确定如何影响它。

【问题讨论】:

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


    【解决方案1】:

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

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

    这里的窍门(据我所知)是您的 TDS 驱动程序已经在尝试将源数据库转换为适当的默认编码供您的客户端读取。由于我们在这里谈论的是 Microsoft 土地,因此适当的默认值是 ISO 8859-1(不记得这是否正是 Latin-1,或者它是否是如此接近以至于人们不会注意到差异)。这就是您的解决方法有效的原因。请参阅here 了解更多信息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多