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

Откуда:
Сообщений: 177
Добрый день!
Прошу помочь разобраться c COLLATE в следующей ситуации:
Переношу приложение с Firebird 2.5 на SQL Server 2014. Используется FireDAC. В базе данных SQL Server`а все строковые поля объявлены как NVARCHAR(). В базе Firebird все строковые поля "работают" в юникоде: SET NAMES UTF8; DEFAULT CHARACTER SET UTF8 COLLATION UTF8; Это пожалуй и было единственное место (как в базе данных, так и в приложении), где упоминалось о Collation. Т.е. указал "UTF8" и все проблемы решил, независимо от того, кто в дальнейшем пользуется программой: или француз, или болгарин, или китаец, или араб... Во всяком случае претензий связанных с Collation не наблюдается...
Наверное поэтому я не особо придал этому моменту значение при переходе на SQL Server. Сейчас сервер устанавливается без параметра /SQLCOLLATION. А берется значение по умолчанию, основаное на локали операционной системы (Cyrillic_General_CI_AS). Разумеется, что и создаваемая БД также по умолчанию подхватывает это значение COLLATE. И заметил действие этого параметра лишь при выполнении запросов с LIKE, когда не получил регистро-зависимого результата (хотя это не является проблемой для адаптируемой программы). Поискал здесь на форуме темы с "COLLATE". И вижу, что вопросов задают в этой связи много и часто.
Вопрос состоит следующем: есть ли какое-то универсальное значение для COLLATE (типа UTF8 у FB), чтобы установить его один раз во время инсталяции сервера ?.. Например, Latin1_General_CI_AS... Будет ли этого достаточно? Не возникнет ли проблем в будещем ?
8 июн 15, 17:32    [17746002]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Alejandro,

А какие проблемы? COLLATE Cyrillic_General_CI_AS как раз и означает Case Insensitive.
В отличие от Case Sensitive (COLLATE Cyrillic_General_CS_AS).
Можно свой COLLATE задавать индивидуально любому полю при создании таблицы.
Можно его задавать у поля непосредственно в запросе.

Вы лучше обратите внимание, чтобы COLLATE базы tempdb совпадал с COLLATE рабочей базы.
Иначе - гемморой!
8 июн 15, 20:23    [17746537]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
Alejandro
Вопрос состоит следующем: есть ли какое-то универсальное значение для COLLATE (типа UTF8 у FB), чтобы установить его один раз во время инсталяции сервера ?.. Например, Latin1_General_CI_AS... Будет ли этого достаточно? Не возникнет ли проблем в будещем ?

в SQL Server COLLATION -- это НЕ кодировка (у вас в FB, кажется, именно кодировка -- UTF-8)
юникодность поля определяется его типом (nchar, nvarchar, ntext -- юникод, char, varchar, text -- ascii), не COLLATION-ом

вы сделали все поля юникодными и проблем быть не должно,
COLLATION в случае юникода повлияет лишь на сортировку в смысле case sensitivity, accent sensitivity.
хотите получить регистрозависимую, отсортируйте с COLLATE ..._CS.

но вот выбрать серверный коллэйшен регистрозависимым,
это означает ввести регистрозависимость еще и самим объектам в базах,
т.е. и dbo.Test, dbo.tEst -- разные объекты.
это очень обрадует разработчиков (придется всегда соблюдать регистр в названиях),
ну и обратного пути не будет, т.е если вам надоест регистрозависимость объектов,
но в наличии будут различающиеся лишь регистром названия, вы получите ошибку
при попытке сменить коллэйшен базе.

еще COLLATION отражает кодовую страницу в случае неюникодных типов,
но вам-то как раз это не грозит.
это, например, имеет смысл, когда все базы сервера работают только с кириллицей
("только" не исключает латиницу, а относится к нац. символам 128-255),
можно наэкономить на строковых данных, храня вместо юникода ascii (различие в размере в 2 раза)

ну еще такое дело, если будете выполнять запрос с кириллицей
в контексте некириллической базы (тот же Latin1_General_CI_AS),
то кириллицу придется передавать юникодом.
8 июн 15, 22:49    [17747158]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
iap
Alejandro,

А какие проблемы? COLLATE Cyrillic_General_CI_AS как раз и означает Case Insensitive.
В отличие от Case Sensitive (COLLATE Cyrillic_General_CS_AS).
Можно свой COLLATE задавать индивидуально любому полю при создании таблицы.
Можно его задавать у поля непосредственно в запросе.

Вы лучше обратите внимание, чтобы COLLATE базы tempdb совпадал с COLLATE рабочей базы.
Иначе - гемморой!


Особенности приложения таковы:
- SQL Server (Экспресс редакция) устанавливается во время установки серверной части приложения. Этот сервер будет обслуживать только базу данных приложения. Что там уже есть в системе касательно SQL серверов - не инетресует.
- База данных "попадает" в приложение двумя путями:
a) во время установки приаттачится заранее заготовленая ДЕМО БД (или ЧИСТАЯ БД)
б) затем пользователь может (с помощью специально написаного конвертора) перенести свои данные из Firebird DB в создаваемую на лету MS SQL DB.
в) пользователи приложения - со всего мира. И "Cyrillic-юзеры" среди них в меньшинстве...
г) использую FireDAC в связке с DevExpress. Все основные гриды основаны на ServerMode версиях cxGrid. Сортировка, фильтрация данных - средствами грида.

В принципе, во время инсталяции вроде бы можно предложить пользователю выбрать Collation для SQL сервера. Хотя там получается около 4000 вариантов! Наверное можно уменьшить список раз в 10, оставив "основные позиции". Тогда получается, что и ДЕМО БД должна быть с таким же Collation как и у сервера. Получается, что генерить ее нужно как-то на лету... А не хотелось бы.
С переносом данных из пользвательской базы из версии на FireBird тут вроде проще: Конвертор создает базу с нуля - создаст ее с серверной Collation. Сомнения в том, нужно ли предлагать индивидуальные Collation ?
Пока я для себя вижу только плюсы в том, чтобы использовать "один вариант Collation для всех". Latin1_General_CI_AS
Сейчас перевел работу Сервера+БД на этот Collation. CI или CS - вообще-то и не суть важно для приложения.
Проверил работу поиска - всё находится: хоть кирилица, хоть японский, хоть португальский. В FireDAC Query просто указал, что тип параметра WideString. Я так понимаю, что это аналог записи WHERE FILE_NAME = N'бла-бла'. Т.е. с поиском юникодных данных проблемы нет.
Наверняка единый параметр Collation будет в плюс и при сопровождении приложения, при обслуживании БД и т.п.
9 июн 15, 13:05    [17749188]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
o-o
вы сделали все поля юникодными и проблем быть не должно,
COLLATION в случае юникода повлияет лишь на сортировку в смысле case sensitivity, accent sensitivity.
хотите получить регистрозависимую, отсортируйте с COLLATE ..._CS.

Вот это я попробую.

o-o
но вот выбрать серверный коллэйшен регистрозависимым,
это означает ввести регистрозависимость еще и самим объектам в базах,
т.е. и dbo.Test, dbo.tEst -- разные объекты.

еще один плюс в сторону CI-варианта Collation

o-o
ну еще такое дело, если будете выполнять запрос с кириллицей
в контексте некириллической базы (тот же Latin1_General_CI_AS),
то кириллицу придется передавать юникодом.

Этот момент я уже протестировал. Загвоздка была в том, как в FireDAC внедрить конструкцию N'текст', когда 'текст' передается как параметр. Главное - не забывать присваивать параметру корректный тип данных (ftWideString).
9 июн 15, 13:14    [17749252]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Пока что оставляю дефолтный COLLATE = Latin1_General_CI_AS
А когда нужен регистрочувствительный поиск, то подключаю соответствующий COLLATE через макрос:
WHERE C.CLIENT_NAME !COLLATION LIKE :SNAME

  case Pars.FCaseSenсitive of
     True:  Query1.MacroByName('COLLATION').AsRaw := 'COLLATE Latin1_General_CS_AS';
     False: Query1.MacroByName('COLLATION').AsRaw := '';
  end;
9 июн 15, 15:47    [17750443]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
Alejandro,

а в каком смысле "пока что"?
серверный коллэйшен выбирают раз и навсегда при установке,
потом его сменить очень дорого будет
9 июн 15, 15:51    [17750462]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Это я к тому, что до релиза продукта еще может что-то измениться.. мало ли... :)
А так да, остается по дефолту Latin1_General_CI_AS
9 июн 15, 16:06    [17750562]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
Alejandro
до релиза продукта еще может что-то измениться..

вы меня не поняли.
коллэйшен сервера выбирается раз и навсегда при установке СЕРВЕРА,
а не продукта.
хотя, может у вас продукт и сервер заодно устанавливает, это да, бывает :)
9 июн 15, 16:25    [17750703]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
как я уже упомянул: Сервер ставится при первой инсталяции продукта. "Свой собственный". Возможность работать через уже существующий Сервер на повестке дня не стоит...
9 июн 15, 17:17    [17751133]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
понятно.
на самом деле, когда вы написали "Сейчас сервер устанавливается без параметра /SQLCOLLATION",
у меня промелькнуло, что вы пишете сообщение и одновременно сервер ставите.
еще думаю: ну, вот сейчас получите ответ и что, переустановите?
ведь установка-то уже запущена :)

а сейчас смотрю, а там целый пост непрочтенный.
тогда у меня вопрос совсем не про коллэйшен, а вот про это:
Alejandro
- SQL Server (Экспресс редакция) устанавливается во время установки серверной части приложения.
Этот сервер будет обслуживать только базу данных приложения.
Что там уже есть в системе касательно SQL серверов - не инетресует.

а вы уверены, что уже не стоит именно экспресс с тем же самым своим традиционным именем по умолчанию?

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

надо бы "интересоваться" тем, что уже установлено, чтобы с ним случайно не законфликтовать.
9 июн 15, 17:30    [17751200]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
Alejandro
в) пользователи приложения - со всего мира. И "Cyrillic-юзеры" среди них в меньшинстве...

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

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

Microsoft SQL Server 2012 Internals By Kalen Delaney, Craig Freeman (about collation)
When running this query on a SQL Server 2012 instance, the result contains 3,885 collations.
Other collations are deprecated and aren’t listed by fn_helpcollations.
Collations fall into two main groups: Windows collations and SQL Server collations.
SQL Server collations are mainly former collations retained for compatibility reasons.
Nevertheless, the collation SQL_Latin1_General_CP1_CI_AS is one of the most commonly used ones
because it’s the default collation when you install SQL Server on a machine with English (United States) as the system locale.
9 июн 15, 18:00    [17751376]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Alejandro
Пока я для себя вижу только плюсы в том, чтобы использовать "один вариант Collation для всех". Latin1_General_CI_AS
Если не будет сортировок, или поисков по условию > или <, то в общем всё равно, какой коллейшен выбрать.
9 июн 15, 18:21    [17751494]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
o-o
Что там уже есть в системе касательно SQL серверов - не инетресует.
а вы уверены, что уже не стоит именно экспресс с тем же самым своим традиционным именем по умолчанию?

Я присвоил "своему" серверу определенное (можно сказать - уникальное) имя через параметр /INSTANCENAME
Во время инсталяции продукта проверяю: установлен ли сервер с таким именем или нет? В зависимости от результата проверки и действую.
Всё очень просто инсталлируется, деинсталлируется. Никаких "интерференций" с другими установлеными серверами не замечено.
9 июн 15, 18:23    [17751506]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
o-o
Alejandro
в) пользователи приложения - со всего мира. И "Cyrillic-юзеры" среди них в меньшинстве...

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

Вот, как раз и хорошо! Значит его и буду использовать. Пока что мне нужно изменить всего один параметр коммандной строки при установке.
Для этого ж и создал тему. :)
9 июн 15, 18:26    [17751518]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
alexeyvg
Alejandro
Пока я для себя вижу только плюсы в том, чтобы использовать "один вариант Collation для всех". Latin1_General_CI_AS
Если не будет сортировок, или поисков по условию > или <, то в общем всё равно, какой коллейшен выбрать.

Операций сравнения > или < со строками точно нет в проекте.
А что касается сортировок... ORDER BY не использую для основных контекстов-гридов, пусть сервер выдает данные как есть. Все равно в cxGrid`е это будет перетасовано по своему. (Хочется думать, что это происходит именно так). Пока что работа cxServerModeGrid полностью устраивает. Объемы самых больших таблиц могут исчисляться тысячами, несколькими десятками тысяч строк, не более.
9 июн 15, 18:34    [17751570]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
o-o
Guest
Alejandro
...SQL_Latin1_General_CP1_CI_AS...

если честно,
то везде пишут, что виндовые коллэйшены лучше сиквельных
(ну т.е. Latin1_General_CI_AS предпочтительнее SQL_Latin1_General_CP1_CI_AS)
не встречаю чего-то ничего свежего,
но если уже в 2005-ом писали:
SQL collations are provided for backward compatibility with earlier versions of SQL Server.
Windows collations provide consistent string comparisons for both Unicode and for non-Unicode text in SQL Server
that are also consistent with string comparisons in the Windows operating system.
For all these reasons, Windows collations are preferred
unless there are backward compatibility issues or specific performance issues that require a SQL collation.
Comparing SQL collations to Windows collations

то уж в более поздних версиях и подавно.

вот еще:
To maintain compatibility with earlier versions of SQL Server, or applications that were developed with SQL Server collations
in earlier versions of SQL Server, SQL Server offers the SQL_Latin1_General_CP1_CI_AS collation as the default collation
for server installations on computers that use the English (United States) Windows system locale.
Collation Types

но там же и пишут, что в случае юникода вообще все равно, т.к.
SQL Server collations apply non-Unicode sorting rules to non-Unicode data,
and Unicode sorting rules to Unicode data, by using a corresponding Windows collation for the Unicode data.

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

почитайте по данным ссылкам,
наверное, все же виндовый коллэйшен политически предпочтительнее,
хотя именно вам, в случае юникода, как раз все равно
9 июн 15, 21:01    [17752249]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о выборе COLLATE  [new]
Alejandro
Member

Откуда:
Сообщений: 177
o-o,

спасибо за инфу
10 июн 15, 13:14    [17754803]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить