Задать вопрос
@saneok44

Django mssql как выполнить чисты запрос в utf16?

При выполнении запроса на вставку с кастом к типу varbinary значения записывает в кодировке я думаю utf-8 и при попытке cast декодировать это значение из базы nvarchar получаю кракозябры, если делаю cast декодировку через varchar получаю нормальный результат. Нужно чтобы декодировка была через nvarchar и поэтому думаю что запрос выполняется в utf-8, а не utf-16 могу ошибаться.

Settings.py
DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': 'Upravdom',
        'USER': 'sa',
        'PASSWORD': 'sezam!',
        'HOST': 'PC1',
        'PORT': '',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'isolation_level': 'READ COMMITTED',
            'charset': 'utf16',
        }
    },
    'IPU': {
        'ENGINE': 'mssql',
        'NAME': 'IPU',
        'USER': 'sa',
        'PASSWORD': 'sezam!',
        'HOST': 'PC1',
        'PORT': '',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'isolation_level': 'READ COMMITTED',
            'charset': 'utf16',
        }
    },
}


dbo.py
def addLogError(errText: str, sqlText: str, parameters: str, functionname: str, username: str, appname: str):
    connection = None

    sql = (f'declare @v_errText varchar(max) = cast(\'{errText}\' as varchar(MAX));'
           f'declare @v_sqlText varchar(max) = cast(\'{sqlText}\' as varchar(MAX));'
           f'declare @v_parameters varchar(max) = cast(\'{parameters}\' as varchar(MAX));'
           f'declare @nv_fn nvarchar(max) = cast(\'{functionname}\' as nvarchar(max));'
           f'declare @nv_un nvarchar(max) = cast(\'{username}\' as nvarchar(max));'
           f'declare @nv_appname nvarchar(max) = cast(\'{appname}\' as nvarchar(max));'
           f''
           f'insert into LogErr([errText], [sqlText], [parameters], [functionname], [username], [AppName]) '
           f'VALUES('
           f'   cast(@v_errText as varbinary(max)), '
           f'   cast(@v_sqlText as varbinary(max)), '
           f'   cast(@v_parameters as varbinary(max)), '
           f'   @nv_fn, @nv_un, @nv_appname'
           f')')

    try:
        connection = django.db.connections['default']
        cursor = connection.cursor()
        cursor.execute(sql)
    except BaseException as e:
        print(e)
    finally:
        if connection:
            connection.close()


База

Результат из базы с кастом nvarchar
Результат из базы с кастом varchar

Как правильно настроить подключение к базе чтобы после вставки я мог из поля varbinary декодировать значение с помощью nvarchar? Пробовал декодировать запрос sql.encode('utf-8').decode('utf-16', errors='ignore') толку 0.

ПС: Библя для работы с базой mssql-django. У кого возникнут вопросы нахрена declare то это уже безысходность моя)
  • Вопрос задан
  • 19 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы