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

发布于 2024-08-20 20:39:37 字数 973 浏览 5 评论 0 原文

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

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

只要我存储由 ASCII 字符组成的字符串,一切就可以了。 当我使用unicode(例如“\xc5\x82”)时,django 会抛出编程错误:

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] = ? '

BTW http://code.google.com/p/django-mssql/ 似乎无法在 Linux 下工作, django-mssql 需要 pythoncom 库。我说得对吗?

I'm trying to store Django data on MS SQL Server 2005 using:

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

As long as I'm storing string consist of ASCII characters everything is ok.
When I'm using unicode (ex. '\xc5\x82'), django throws ProgrammingError on:

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

last element of trace is:

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/ doesn't seems to work under Linux,
django-mssql needs pythoncom library. Am I right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半城柳色半声笛 2024-08-27 20:39:37

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

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

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

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

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

We use Django with SQL Server 2005. We found the same problem you did.

What ODBC driver are you using? FreeTDS?

We tried finding a good ODBC driver for linux/unix to use that would not throw the error above (and others) when unicode would come into play - and failed miserably. None of the drivers we tested - at least three, I can dig the names up if you would like - had any success in dealing with unicode strings via django-pyodbc.

What we ended up doing, sad as it might sound, was to decide to run Django on a Windows server (Apache + mod_wsgi) and use the Microsoft's SQL Native ODBC driver.

It works just fine - unicode wise - when we do that.

桃酥萝莉 2024-08-27 20:39:37

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

client charset = UTF-8

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

OK, the solution was found. In file freetds.conf there is

client charset = UTF-8

and it works exactly like it should.

清旖 2024-08-27 20:39:37

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

in addition to the accepted response, it is possible to fix this error dirrectly in the 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,
        },

     }
}

take a look at the extra_params

this don't rely on the global freetds.conf file, so it is better

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文