Ao recuperar um valor de texto, que foi armazenado em um varbinary
campo, e convertê-lo novamente em texto, existe uma maneira de determinar se ele foi armazenado como um VARCHAR
ou NVARCHAR
string? Se for desconhecido, dizer à CONVERT
função que é uma NVARCHAR
string, quando na verdade VARCHAR
é, retornará algo sem sentido. Execute o abaixo para um exemplo:
IF OBJECT_ID(N'dbo.Temp') IS NOT NULL
DROP TABLE dbo.Temp;
CREATE TABLE Temp(
ID INT IDENTITY(0,1) NOT NULL
,Test VARBINARY(50) NULL
);
INSERT INTO dbo.Temp (Test) VALUES( CONVERT(VARBINARY(50), 'varchar test string'));
INSERT INTO dbo.Temp (Test) VALUES( CONVERT(VARBINARY(50), N'nvarchar test string'));
SELECT CONVERT(VARCHAR, Test) AS [VARCHAR], CONVERT(NVARCHAR, Test) AS [NVARCHAR]
FROM dbo.Temp;
Isso não é realmente possível em geral.
O intervalo completo de
0x00
a0xFF
é válido paravarchar
e de0x0000
para0xFFFF
paranvarchar
, portanto, é impossível distinguir entre dois bytes que representam 2 caracteres varchar ou um úniconvarchar
caractere.0x4141
pode ser'AA'
ouN'䅁'
Se
DATALENGTH
é estranho, então você sabe que évarchar
.Além disso, se o texto for principalmente ASCII padrão, como no seu exemplo, ele conterá muito
0x00
quando armazenado como binário ifnvarchar
.Este provavelmente não é um caractere que você espera encontrar razoavelmente em
varchar
strings, então a presença dele pode ser tomada como evidência de que a string énvarchar
.