Как VARCHAR / CHAR удается хранить / отображать многонациональные символы в SQL Server? - PullRequest
0 голосов

Я читал, что varchar (char) используется для хранения символов ASCII с 1 байтом на символ, а nvarchar (varchar) использует UNICODE с 2 байтами.
Но какой ASCII?В SSMS 2008 R2

DECLARE @temp VARCHAR(3); --CHAR(3)   
SET @temp = 'ЮЯç'; --cyryllic + portuguese-specific letters
select @temp,datalength(@temp) 
-- results in 
-- ЮЯç  3

Обновление: Ой, результат был действительно ЮЯс, но не ЮЯч.Спасибо, Мартин

Ответы [ 2 ]

3 голосов
/ 16 октября 2010
declare @table table
(
c1 char(4) collate Cyrillic_General_CS_AI,
c2 char(4) collate Latin1_General_100_CS_AS_WS
)

INSERT INTO @table  VALUES (N'ЮЯçæ', N'ЮЯçæ')

SELECT c1,cast(c1 as binary(4)) as c1bin, c2, cast(c2 as binary(4)) as c2bin
FROM @table

Возвращает

c1   c1bin      c2   c2bin
---- ---------- ---- ----------
ЮЯc? 0xDEDF633F ??çæ 0x3F3FE7E6

Вы можете видеть, что в зависимости от сопоставления не ASCII-символы могут быть потеряны или тихо преобразованы в почти эквиваленты.

1 голос
/ 16 октября 2010

Это ASCII с кодовой страницей, которая определяет верхние 128 символов (128-255). Это контролируется «сопоставлением» в SQL Server, и в зависимости от используемого сопоставления можно использовать подмножество «специальных» символов.

См. эту страницу MSDN .

...