При выполнении запроса на вставку с кастом к типу 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 то это уже безысходность моя)