5

我正在尝试使用以下方法将 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] = ? '

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

4

3 回答 3

2

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

您使用的是什么 ODBC 驱动程序?免费TDS?

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

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

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

于 2010-02-03T18:20:34.780 回答
1

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

client charset = UTF-8

它的工作方式与应有的完全一样。

于 2010-02-03T18:23:50.547 回答
0

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

于 2015-03-02T15:41:28.973 回答