Sql server 德扬戈<-&燃气轮机;SQL Server 2005,文本编码问题

Sql server 德扬戈<-&燃气轮机;SQL Server 2005,文本编码问题,sql-server,django,unicode,odbc,freetds,Sql Server,Django,Unicode,Odbc,Freetds,我正在尝试使用以下方式在MS SQL Server 2005上存储Django数据: (pyodbc+FreeTDS) 只要我存储的字符串由ASCII字符组成,一切都正常。 当我使用unicode(例如'.\xc5\x82')时,django会在以下位置抛出编程错误: ProgrammingError at /admin/cli/punktrejestracji/add/ ('42000', '[42000] [FreeTDS][SQL Server]The incoming tabular

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

(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] = ? '
params('\xc5\x82',)
自己
sql'从[cli_punktrejestracji]中选择(1)作为[a],其中[cli_punktrejestracji].[adres]=?'
顺便说一句,Linux下似乎不工作,
django mssql需要pythoncom库。我说的对吗?

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

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

我们试图为linux/unix找到一个好的ODBC驱动程序,当unicode开始使用时,它不会将错误抛到上面(以及其他错误),但失败得很惨。我们测试的驱动程序——至少有三个,如果你愿意的话,我可以把名字挖出来——都没有通过django pyodbc成功地处理unicode字符串

我们最终做了一件听起来很悲哀的事情,那就是决定在Windows服务器(Apache+mod_wsgi)上运行Django,并使用Microsoft的SQL原生ODBC驱动程序


当我们这样做的时候,它就可以很好地使用unicode了。

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

client charset = UTF-8

它的工作原理与它应该的完全相同。

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

     }
}
查看
额外参数


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

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