Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 почему бинарное представление разное?  [new]
вопрос про collation
Guest
+ repro

create table t1(data varchar(100) collate Cyrillic_General_CI_AI);
go

create table t2(data varchar(100) collate SQL_Latin1_General_CP1250_CI_AS);
go

insert into t1(data) values('Тест');
go

insert into t2(data)
select data
from
	t1

select cast(data as varbinary(100))
from t1

select cast(data as varbinary(100))
from t2



надеялся получить одинаковые значения в последних двух селектах. оно что при сохранении в колонку с collation в котором codepage другой осуществляет перекодирование? а по какому правилу?
16 апр 14, 10:21    [15888964]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
Glory
Member

Откуда:
Сообщений: 104751
create table t1(data nvarchar(100) collate Cyrillic_General_CI_AI);
go

create table t2(data nvarchar(100) collate SQL_Latin1_General_CP1250_CI_AS);
go

insert into t1(data) values(N'Тест');
go

insert into t2(data)
select data
from
	t1

select cast(data as varbinary(100))
from t1

select cast(data as varbinary(100))
from t2
16 апр 14, 10:26    [15889000]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
aleks2
Guest
Врешь

0xD2E5F1F2

(1 row(s) affected)


0xD2E5F1F2

(1 row(s) affected)
16 апр 14, 10:27    [15889009]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
вопрос про collation
Guest
aleks2,

К сообщению приложен файл. Размер - 11Kb
16 апр 14, 10:36    [15889064]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
вопрос про collation
Guest
Glory
create table t1(data nvarchar(100) collate Cyrillic_General_CI_AI);
go

create table t2(data nvarchar(100) collate SQL_Latin1_General_CP1250_CI_AS);
go

insert into t1(data) values(N'Тест');
go

insert into t2(data)
select data
from
	t1

select cast(data as varbinary(100))
from t1

select cast(data as varbinary(100))
from t2


зачем изменили на nvarchar? :) вопрос был про varchar, интересует технический момент - что происходит в этом случае при сохранении. а при nvarchar понятно.
16 апр 14, 10:41    [15889087]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
вопрос про collation
Guest
select collationproperty(N'Cyrillic_General_CI_AI', N'CodePage') src, collationproperty(N'SQL_Latin1_General_CP1250_CI_AS', N'CodePage') dest


srcdest
12511250


кодировки в примере нарочно выбраны разные. получается в случае char/varchar, используется кодировка из collation, а при сохранении из/в различные кодировки, SQL Server пытается конвертировать как-то? если нет почему тогда бинарное представление разное?
16 апр 14, 10:48    [15889147]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
o-o
Guest
да, перекодирует.
через unicode code point.
т.е. видит, что на входе кириллический символ "T" с кодовой страницы 1251,
находит соответствующее ему unicode code point -- 0422,
затем ищет, что этому 0422 соответствует в 1250.
ничего.
заменяет на знак вопроса.
то же самое проделывает для "е", "с", "т".

поэтому во вторую таблицу легли знаки вопроса.
16 апр 14, 10:51    [15889170]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
вопрос про collation
Guest
o-o
да, перекодирует.
через unicode code point.
т.е. видит, что на входе кириллический символ "T" с кодовой страницы 1251,
находит соответствующее ему unicode code point -- 0422,
затем ищет, что этому 0422 соответствует в 1250.
ничего.
заменяет на знак вопроса.
то же самое проделывает для "е", "с", "т".

поэтому во вторую таблицу легли знаки вопроса.


ох тыж спасибо большое вам!
16 апр 14, 10:54    [15889198]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
вопрос про collation,

А у меня это выглядит вот так:
select *, cast(data as varbinary(20))
from @t1;

select *, cast(data as varbinary(20))
from @t2;

data                 
-------------------- ------------------------------------------
????                 0x3F3F3F3F

data                 
-------------------- ------------------------------------------
????                 0x3F3F3F3F
На машине и в сиквеле вообще нет поддержки русского, весь инстанс в Latin1_General_CI_AS.

Вы сниффер не пробовали ставить? Выглядит так, будто SSMS подменяет символы при отправке запроса (ну или драйвер, не знаю).
16 апр 14, 10:58    [15889232]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
Glory
Member

Откуда:
Сообщений: 104751
вопрос про collation
зачем изменили на nvarchar? :) вопрос был про varchar, интересует технический момент

Чтобы исключить влияние клиентского приложения
16 апр 14, 11:00    [15889254]     Ответить | Цитировать Сообщить модератору
 Re: почему бинарное представление разное?  [new]
o-o
Guest
Ennor Tiegael
вопрос про collation,

А у меня это выглядит вот так:
select *, cast(data as varbinary(20))
from @t1;

select *, cast(data as varbinary(20))
from @t2;

data                 
-------------------- ------------------------------------------
????                 0x3F3F3F3F

data                 
-------------------- ------------------------------------------
????                 0x3F3F3F3F
На машине и в сиквеле вообще нет поддержки русского, весь инстанс в Latin1_General_CI_AS.

Вы сниффер не пробовали ставить? Выглядит так, будто SSMS подменяет символы при отправке запроса (ну или драйвер, не знаю).


а Вам, раз база с некириллическим коллейшеном,
он сразу сложил вопросики.
т.к. увидел, что пришел некириллический символ, а хотите его положить в кириллическое поле
(Вы выполнили код в контексте некириллической базы)
поправьте при вводе:
insert into t1(data) values(N'Тест');

и все получится
16 апр 14, 11:10    [15889349]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить