É possível restaurar os dados UTF8 de um nvarchar corrompido, que foi usado sem o N
prefixo?
Por exemplo, no snippet a seguir, gostaria @n1_fixed
de ter o valor correto com base em @n1
:
declare
@n1 nvarchar(10) = 'Ḿấxiḿứś',
@n2 nvarchar(10) = N'Ḿấxiḿứś';
declare
@n1_fixed nvarchar(10); -- somehow make it have the correct value, based on @n1
select iif(@n1_fixed = @n2, 1, 0)
Não é possível recuperar o valor original.
Constantes de caracteres sem o
N
prefixo para denotar caracteres nacionais são traduzidas de acordo com a página de código de agrupamento padrão do banco de dados. Nos casos em que não existe mapeamento claro para o caractere de origem, o valor é alterado para um caractere de fallback. Esse fallback pode ser um caractere semelhante, mas diferente, ou o valor?
quando não existe nenhum caractere alternativo.Você pode observar isso lançando o valor como varbinary. Exemplo com um
SQL_Latin1_General_CP1_CI_AS
agrupamento de banco de dados padrão, que usa a página de código 1252:Os resultados do mesmo script com um
Albanian_100_CI_AS
agrupamento padrão de banco de dados mostram que o último caractere está mapeado corretamente devido à página de código 1250, mas os caracteres foram alterados para o '?' fallback são perdidos permanentemente como no exemplo anterior.