【问题标题】:Django <-> SQL Server 2005, text encoding problemDjango <-> SQL Server 2005,文本编码问题
【发布时间】:2011-01-12 16:10:16
【问题描述】:

我正在尝试使用以下方法将 Django 数据存储在 MS SQL Server 2005 上:

http://code.google.com/p/django-pyodbc/ (pyodbc + FreeTDS)

只要我存储由 ASCII 字符组成的字符串,一切正常。 当我使用 unicode(例如 '\xc5\x82')时,django 会在以下位置抛出 ProgrammingError:

ProgrammingError at /admin/cli/punktrejestracji/add/
('42000', '[42000] [FreeTDS][SQL Server]The incoming tabular data stream (TDS) protocol stream is incorrect. The stream ended unexpectedly. (4002) (SQLExecDirectW)')

trace 的最后一个元素是:

params  ('\xc5\x82',)
self    <django.db.backends.sql_server.pyodbc.base.CursorWrapper object at 0x92ef8ec>
sql 'SELECT (1) AS [a] FROM [cli_punktrejestracji] WHERE [cli_punktrejestracji].[adres] = ? '

顺便说一句,http://code.google.com/p/django-mssql/ 在 Linux 下似乎不起作用, django-mssql 需要 pythoncom 库。我说的对吗?

【问题讨论】:

    标签: sql-server django unicode odbc freetds


    【解决方案1】:

    我们将 Django 与 SQL Server 2005 一起使用。我们发现了与您相同的问题。

    您使用的是什么 ODBC 驱动程序? FreeTDS?

    我们尝试为 linux/unix 找到一个好的 ODBC 驱动程序,以便在 unicode 发挥作用时不会抛出上述错误(和其他错误) - 并且惨遭失败。我们测试的驱动程序中没有一个 - 至少三个,如果你愿意,我可以挖掘名称 - 在通过 django-pyodbc 处理 unicode 字符串方面取得任何成功。

    我们最终做的是决定在 Windows 服务器 (Apache + mod_wsgi) 上运行 Django 并使用 Microsoft 的 SQL Native ODBC 驱动程序,这听起来可能很悲伤。

    当我们这样做时,它工作得很好 - unicode 明智的。

    【讨论】:

      【解决方案2】:

      好的,找到了解决方案。在文件 freetds.conf 中有

      client charset = UTF-8
      

      它的工作原理与它应有的完全一样。

      【讨论】:

      • 我们尝试使用它,虽然它修复了一些错误消息,但并没有修复所有错误消息。我希望它对你有用。
      • 我也是 :-) 如果没有,我们可能需要将技术从 django 更改为其他技术。
      • 我不介意收到你的来信——也许这里有另一个评论——如果事情顺利的话。除了 Django 和 django-pyodbc 的发布,您还取得了成功... :-)
      • 这不完全是我的项目,公司的另一个人正在研究这个 - 我们的部门坚持开源解决方案 ;-) 但我会在一段时间内问他,进展如何以及他是否有任何成功。
      • 看来,这个解决方案是有效的。至少到目前为止,我们还没有遇到任何问题。
      【解决方案3】:

      除了接受的响应外,还可以在 settings.py 中直接修复此错误:

      DATABASES = {
          'default': {
              'ENGINE': 'sql_server.pyodbc',
              'NAME': 'MyTableName',
              'HOST': r'server.lan\server_instance_name',
              'USER': 'sa',
              'PASSWORD': 'P@SsW0Rd',
              'OPTIONS': {
                  'host_is_server': True,
                  "extra_params":"TDS_Version=8.0;ClientCharset=UTF-8",
                  "autocommit": True,
                  "driver_needs_utf8":True,
              },
      
           }
      }
      

      看看extra_params

      这个不依赖全局freetds.conf文件,这样比较好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2011-07-02
        • 2011-08-28
        • 1970-01-01
        相关资源
        最近更新 更多