Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Collation vs nvarchar vs localisation  [new]
stenford
Member

Откуда: урал
Сообщений: 2830
Как связаны эти 3 вещи?
Скажем если версия винды английская, то вставить русский текст (или любой другой) можно только установив поле в nvarchar. Нужно-ли в этом случае устанавливать и collation на русский тоже и если да то зачем если и так вроде все работает?
Если локализация винды русская, то все должно работать и с varchar, опять-же нужно-ли ставить коллейшн в этоим случае если и так работает? Непонятно только почему работает varchar в этом случае, ему-ж байт не должно хватать для русских букв?
В общем как правильно этими вещами манипулировать в многоязычных системах, скажем клиент работает на арабском языке, ставим ему nvarchar + арабский коллейшн? А если коллейшн не изменять, то чем это грозит?
17 авг 17, 02:28    [20729853]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
читать доку полезно, в ней написано
varchar
nvarchar
17 авг 17, 02:38    [20729857]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
aleks222
Guest
Дедушка
читать доку полезно, в ней написано
varchar
nvarchar

У тредстартера непонимание основ, а ты ему мелочи жизни тычешь.

1. Varchar = 1-о байтовая кодировка, она же ASCII.
2. Nvarchar = 2-х байтовая кодировка, она же UNICODE.

3. Collation = правило сравнения/сортировки символов.
17 авг 17, 05:52    [20729878]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
stenford
Member

Откуда: урал
Сообщений: 2830
ок, коллейшн нужен для сортировки, значит с неверным коллейшн текст хранится будет, но операции поиска и сравнения не будут работать верно если коллейшн английский, а текст в nvarchar русский или арабский, это верно?
По-прежнему непонятно почему на русской локали русский текст замечательно хранится в varchar, почему так происходит?
17 авг 17, 08:03    [20729932]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
stenford
операции поиска и сравнения не будут работать верно если коллейшн английский, а текст в nvarchar русский или арабский, это верно?
Операции поиска и сравнения будут работать по правилам того коллейшена, который вы укажете для этих операций. Независимо от каких то "установок коллейшена", про которые вы писали
stenford
По-прежнему непонятно почему на русской локали русский текст замечательно хранится в varchar, почему так происходит?
В varchar хранится не русский, или какой то другой, текст, а байты, т.е. цифры со значениями от 0 до 255.

В древние времена, когда UNICODE ещё не придумали, тексты на любых языках хранились именно в таком виде, и каждый раз определялись "кодировки", указывающие, какую букву нужно показывать на экране для каждого значения байта.

Так вот, когда вы устанавливаете "русскую локаль", в виндах делается специальная установка, которая указывает, что ряд байтов в однобайтных символах интерпретируются как русские буквы. Там настройка даже так называется, понятно.
17 авг 17, 08:52    [20729975]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
stenford
ок, коллейшн нужен для сортировки, значит с неверным коллейшн текст хранится будет, но операции поиска и сравнения не будут работать верно если коллейшн английский, а текст в nvarchar русский или арабский, это верно?
Но в общем да, правильно, не будут.

Вы указываете для сортировки определённый коллейшен, и сортировка будет работать по правилам этого коллейшена.
И перекрёстные правила сортировки, как я понимаю, в этом стандарте не определены, т.е., как я понимаю, остальные символы будут сортироваться по значениям кодов?

Или в коллейшене вес символа определён для всех символов, а не только для символов этого языка?
Кто знает стандарт, расскажите!
17 авг 17, 08:56    [20729983]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg,

медитируйте
http://collation-charts.org/mssql/
17 авг 17, 09:01    [20729992]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
alexeyvg
байты, т.е. цифры со значениями от 0 до 255
Это числа.
А десятичные цифры - это 0,1,2,3,4,5,6,7,8,9, и всё.
17 авг 17, 09:53    [20730130]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
alexeyvg
байты, т.е. цифры со значениями от 0 до 255
Это числа.
А десятичные цифры - это 0,1,2,3,4,5,6,7,8,9, и всё.

арабские цифры жеж
17 авг 17, 09:55    [20730135]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
TaPaK
iap
пропущено...
Это числа.
А десятичные цифры - это 0,1,2,3,4,5,6,7,8,9, и всё.

арабские цифры жеж
От основания системы тоже зависит.
A,B,C,D,E,F тоже могут быть цифрами. Шестнадцатиричными.
17 авг 17, 10:03    [20730171]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
TaPaK
пропущено...

арабские цифры жеж
От основания системы тоже зависит.
A,B,C,D,E,F тоже могут быть цифрами. Шестнадцатиричными.

нисомненно, полемика наше всё
17 авг 17, 10:06    [20730186]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
o-o
Guest
stenford
По-прежнему непонятно почему на русской локали русский текст замечательно хранится в varchar, почему так происходит?

локаль тут вообще никаким местом.
а вот коллэйшен столбца еще как при чем.
кириллица будет именно кириллицей в варчаре только при условии,
что коллэйшен столбца кирилический,
и если заносили эту самую кириллицу либо в контексте кириллической же базы,
либо передавали юникодом.

ибо коллэйшен это не только "правила сортировки".
каждому коллэйшену соответствует определенная кодовая страница,
и именно ее будет использовать сервер, отдавая вам байты из варчара в виде символов
17 авг 17, 23:01    [20732781]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
stenford
Member

Откуда: урал
Сообщений: 2830
o-o
stenford
По-прежнему непонятно почему на русской локали русский текст замечательно хранится в varchar, почему так происходит?

локаль тут вообще никаким местом.
а вот коллэйшен столбца еще как при чем.
кириллица будет именно кириллицей в варчаре только при условии,
что коллэйшен столбца кирилический,
и если заносили эту самую кириллицу либо в контексте кириллической же базы,
либо передавали юникодом.

ибо коллэйшен это не только "правила сортировки".
каждому коллэйшену соответствует определенная кодовая страница,
и именно ее будет использовать сервер, отдавая вам байты из варчара в виде символов

т.е. на русской локали если коллейшн английский, то varchar русские буквы хранить не будет? Почему тогда на английской локали если я ставлю русский коллешн, то русские буквы не сохраняются? Путаница какая-то
18 авг 17, 03:04    [20732901]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
aleks222
Guest
stenford
o-o
пропущено...

локаль тут вообще никаким местом.
а вот коллэйшен столбца еще как при чем.
кириллица будет именно кириллицей в варчаре только при условии,
что коллэйшен столбца кирилический,
и если заносили эту самую кириллицу либо в контексте кириллической же базы,
либо передавали юникодом.

ибо коллэйшен это не только "правила сортировки".
каждому коллэйшену соответствует определенная кодовая страница,
и именно ее будет использовать сервер, отдавая вам байты из варчара в виде символов

т.е. на русской локали если коллейшн английский, то varchar русские буквы хранить не будет? Почему тогда на английской локали если я ставлю русский коллешн, то русские буквы не сохраняются? Путаница какая-то


А ты не слушай идиотов.
Varchar хранит БАЙТЫ, т.е. восьмибитные заначения от 0 до 255.
И срал он на коллейшн.

Это лехко проверить.
Напихайте туды любой шняги и смените коллэйшн поля или унесите базу на сервер с другим коллэйшн - ничего не изменится.
Более того, сама возможность писать
aField collate ТраЛяЛя

намекает на ЭТО.

o-o
и именно ее будет использовать сервер, отдавая вам байты из варчара в виде символов

Шедевр идиотизма.
Байты остаются байтами.
Всегда.

stenford
т.е. на русской локали если коллейшн английский, то varchar русские буквы хранить не будет? Почему тогда на английской локали если я ставлю русский коллешн, то русские буквы не сохраняются? Путаница какая-то

Все проблемы такого сорта - суть проблемы обмена с ВНЕШНИМИ системами.
Когда внешняя система передает серверу строку байт она передает и "язык этой строки".
Ну а сервер (точнее даже, клиентские библиотеки для связи с сервером) проявляет находчивость, если в "языке строки" не предполагается наличия некоторых значений байта ( например для английского - всех значений >128 ) - сервер любезно херит эти "неправильные" байты.
Обойти это можно, передавая строку байт как binary - тогда никакой обработки не будет и в varchar попадет "в точности" те значения байт, которые передали.
18 авг 17, 06:20    [20732925]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
o-o
Guest
aleks222
stenford
пропущено...

т.е. на русской локали если коллейшн английский, то varchar русские буквы хранить не будет? Почему тогда на английской локали если я ставлю русский коллешн, то русские буквы не сохраняются? Путаница какая-то


А ты не слушай идиотов.
Varchar хранит БАЙТЫ, т.е. восьмибитные заначения от 0 до 255.
И срал он на коллейшн.

Это лехко проверить.
Напихайте туды любой шняги и смените коллэйшн поля или унесите базу на сервер с другим коллэйшн - ничего не изменится.
Более того, сама возможность писать
aField collate ТраЛяЛя

намекает на ЭТО.


o-o
и именно ее будет использовать сервер, отдавая вам байты из варчара в виде символов

Шедевр идиотизма.
Байты остаются байтами.
Всегда.


наивный чукотский дарагуля,
получи-ка картинкой ответ

+ репро-код

if object_id('dbo.t') is not null drop table dbo.t;

create table dbo.t (col_cyr varchar(400) collate cyrillic_general_ci_as,
                    col_gr  varchar(400) collate greek_ci_as); 

insert into dbo.t (col_cyr) values (N'алекс трижды двоечник и прочая шняга кириллицей');

select *
from dbo.t;
--col_cyr	col_gr
--алекс трижды двоечник и прочая шняга кириллицей	NULL

update dbo.t
set col_gr = cast(col_cyr as varbinary(400));

select *,
       col_gr collate cyrillic_general_ci_as as col_gr_collate_cyr,
       cast(col_cyr as varbinary(400)) as col_cyr_bytes,
       cast(col_gr  as varbinary(400)) as col_gr_bytes
from dbo.t;


пояснения.
в таблице 2 поля-варчара, один с кириллическим коллэйшеном,
другой с греческим.
кладем в первое поле кириллицу.
во второе кладем те же самые байты, просто тупо копируем их из первого.
для тех, кто еще сомневается, что байты все те же,
выведем их селектом в виде
cast(col_cyr as varbinary(400)) as col_cyr_bytes,
cast(col_gr  as varbinary(400)) as col_gr_bytes

ну а теперь кажется алекс обещал нам одинаковый результат при селекте, ведь байты все те же?
ну, убеждаемся в их "одинаковости" при селекте в виде варчара.
да, варчара, дарагуля, ибо ТС не про варбайнари спрашивал, а про варчар.
и сервер ему байты (те же самые байты!) отдает в соответствии с коллэйшеновой кодовой страницей.

нет, конечно, последователи алекса-трижды двоечника могут продолжить работу именно с варбайнари,
ведь поле оно на то и объявлено варчаровым, чтобы оттуда выгребать именно байты.
ну или может нас спасет col_gr collate cyrillic_general_ci_as?

результаты на картинке, код приложен.
запускайте, проверяйте.

алекс, что бы ты ни говорил, ты ВАСЯ.
кстати, дарагуля, двойки получше к нику прибей,
а то при очередном надувании щек ненароком отвалятся

К сообщению приложен файл. Размер - 27Kb
18 авг 17, 15:08    [20734454]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
aleks222
Guest
o-o
aleks222
пропущено...


А ты не слушай идиотов.
Varchar хранит БАЙТЫ, т.е. восьмибитные заначения от 0 до 255.
И срал он на коллейшн.

Это лехко проверить.
Напихайте туды любой шняги и смените коллэйшн поля или унесите базу на сервер с другим коллэйшн - ничего не изменится.
Более того, сама возможность писать
aField collate ТраЛяЛя

намекает на ЭТО.


пропущено...

Шедевр идиотизма.
Байты остаются байтами.
Всегда.


наивный чукотский дарагуля,
получи-ка картинкой ответ

+ репро-код

if object_id('dbo.t') is not null drop table dbo.t;

create table dbo.t (col_cyr varchar(400) collate cyrillic_general_ci_as,
                    col_gr  varchar(400) collate greek_ci_as); 

insert into dbo.t (col_cyr) values (N'алекс трижды двоечник и прочая шняга кириллицей');

select *
from dbo.t;
--col_cyr	col_gr
--алекс трижды двоечник и прочая шняга кириллицей	NULL

update dbo.t
set col_gr = cast(col_cyr as varbinary(400));

select *,
       col_gr collate cyrillic_general_ci_as as col_gr_collate_cyr,
       cast(col_cyr as varbinary(400)) as col_cyr_bytes,
       cast(col_gr  as varbinary(400)) as col_gr_bytes
from dbo.t;


пояснения.
в таблице 2 поля-варчара, один с кириллическим коллэйшеном,
другой с греческим.
кладем в первое поле кириллицу.
во второе кладем те же самые байты, просто тупо копируем их из первого.
для тех, кто еще сомневается, что байты все те же,
выведем их селектом в виде
cast(col_cyr as varbinary(400)) as col_cyr_bytes,
cast(col_gr  as varbinary(400)) as col_gr_bytes

ну а теперь кажется алекс обещал нам одинаковый результат при селекте, ведь байты все те же?
ну, убеждаемся в их "одинаковости" при селекте в виде варчара.
да, варчара, дарагуля, ибо ТС не про варбайнари спрашивал, а про варчар.
и сервер ему байты (те же самые байты!) отдает в соответствии с коллэйшеновой кодовой страницей.

нет, конечно, последователи алекса-трижды двоечника могут продолжить работу именно с варбайнари,
ведь поле оно на то и объявлено варчаровым, чтобы оттуда выгребать именно байты.
ну или может нас спасет col_gr collate cyrillic_general_ci_as?

результаты на картинке, код приложен.
запускайте, проверяйте.

алекс, что бы ты ни говорил, ты ВАСЯ.
кстати, дарагуля, двойки получше к нику прибей,
а то при очередном надувании щек ненароком отвалятся


И как картинка КЛИЕНТСКОГО приложения опровергает то, что сказано мною?
18 авг 17, 16:28    [20734837]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
o-o
Guest
ну так научи страдальца, как получить кириллицу из второй колонки моей таблицы.
что-то aField collate ТраЛяЛя не канает.

и оказывается, это не сервер отдал мне кириллицу, а SSMS?
ну так ты научи, как напрямую, без использования клиента, данные из таблицы получать.
заодно посмотрим, что тебе вернут
18 авг 17, 16:40    [20734881]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Collation vs nvarchar vs localisation  [new]
sibir127
Member

Откуда:
Сообщений: 21
o-o,
прочитал ваш диалог, может поможете?
не могу работать с кирилицей
проблема в обмене данных с содержанием русских слов(на кирилице), победить настройками параметров на связанном сервере(Use remote collation, Collation compatible, Collation name), настройкой драйвера ODBC (OEM/ANSI conversion), параметры DB-library в клиенте SQL Server (Автоматическое преобразование ANSI->OEM)
есть подключенный связанный сервер actian psql v.13 и БД с code page cp866 и Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Enterprise Edition
подскажите комбинацию параметров, немного (слабо сказано запутался) нужно волшебного пенделя.

Column
Id_вет! Sasha
??????! Sasha
??????! Sasha
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
Id_вет! DuceNucken must die
AEIЕD AAДEI ЕAAЕIЬЕAEx
19 ноя 19, 22:34    [22020111]     Ответить | Цитировать Сообщить модератору
 Re: Collation vs nvarchar vs localisation  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
чтобы запихать русский в vаrchar нужно OEM преобразовать в мултибайтную кодировку и уже запихивать как массив двубайтных слов.

и так же обратно доставать. колайшен тут будет одинаково фиолетовый
20 ноя 19, 00:26    [22020163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить