Django <-> SQL Server 2005, проблема кодирования текста - PullRequest
5 голосов
/ 03 февраля 2010

Я пытаюсь сохранить данные Django на MS SQL Server 2005, используя:

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

Пока я сохраняю строку состоитиз символов ASCII все в порядке.Когда я использую юникод (например, '\ 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)')

последний элемент трассировки:

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.Я прав?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Мы используем Django с SQL Server 2005. Мы нашли ту же проблему, что и вы.

Какой драйвер ODBC вы используете? FreeTDS

Мы попытались найти хороший драйвер ODBC для Linux / Unix, который не использовал бы ошибку выше (и другие), когда в игру вступил бы юникод, - и с треском провалился. Ни один из протестированных нами драйверов - по крайней мере, три, я могу выкопать имена, если хотите, - не имел успеха в работе со строками Unicode через django-pyodbc.

То, что мы в конечном итоге сделали, как это ни печально, было решение запустить Django на сервере Windows (Apache + mod_wsgi) и использовать собственный драйвер Microsoft ODBC для SQL.

Когда мы это делаем, все работает отлично - в юникоде.

1 голос
/ 03 февраля 2010

ОК, решение найдено.В файле freetds.conf есть

client charset = UTF-8

, и он работает точно так, как должен.

0 голосов
/ 02 марта 2015

в дополнение к принятому ответу, возможно прямое исправление этой ошибки в 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, так что лучше

...