代码之家  ›  专栏  ›  技术社区  ›  gruszczy

Django<->SQL Server 2005,文本编码问题

  •  5
  • gruszczy  · 技术社区  · 16 年前

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

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

    只要我存储由ASCII字符组成的字符串,一切都可以。 当我使用unicode(例如“xc5\x82”)时,django将programmingeror抛出到:

    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)')
    

    跟踪的最后一个元素是:

    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库。我说的对吗?

    3 回复  |  直到 11 年前
        1
  •  2
  •   cethegeek    16 年前

    我们将django与SQL Server 2005结合使用。我们发现了和你一样的问题。

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

    我们试图找到一个好的用于Linux/Unix的ODBC驱动程序,当Unicode发挥作用时,这个驱动程序不会把错误抛到上面(和其他驱动程序),结果失败得很惨。我们测试过的驱动程序中没有一个——至少有三个,如果你愿意的话,我可以查出来——在通过django-pyodbc处理unicode字符串方面有任何成功。

    我们最后做的,虽然听起来很悲伤,但是决定在Windows服务器(apache+mod_wsgi)上运行django并使用微软的SQL原生ODBC驱动程序。

    当我们这样做的时候,它就可以很好地工作了。

        2
  •  1
  •   gruszczy    16 年前

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

    client charset = UTF-8
    

    它的工作原理和它应该的完全一样。

        3
  •  0
  •   ornoone    11 年前

    除了接受的响应之外,还可以在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

    这不依赖于global freetds.conf文件,因此更好