Какво прави „COLLATE SQL_Latin1_General_CP1_CI_AS“?

Имам SQL заявка за създаване на базата данни в SQLServer, както е дадено по-долу:

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

Работи добре.

Докато останалата част от SQL е ясна, аз съм доста объркан относно функционалността на COLLATE SQL_Latin1_General_CP1_CI_AS.

Може ли някой да ми обясни това? Освен това бих искал да знам дали създаването на базата данни по този начин е най-добра практика?


person Thunder    schedule 18.02.2011    source източник


Отговори (5)


Той задава как сървърът на базата данни сортира (сравнява части от текст). в такъв случай:

SQL_Latin1_General_CP1_CI_AS

се разделя на интересни части:

  1. latin1 кара сървъра да третира низовете, използвайки charset latin 1, основно ascii
  2. CP1 означава Кодова страница 1252
  3. CI сравнения без значение за малки и големи букви, така че "ABC" ще е равно на "abc"
  4. AS чувствителен към акцента, така че „ü“ не е равно на „u“

P.S. За по-подробна информация не забравяйте да прочетете отговора на @solomon-rutzky.

person Kris    schedule 18.02.2011
comment
Каква би била разликата между това и SQL_Latin1_General_CI_AS. По-конкретно, CP1 ме накара да се чудя. - person Kad; 21.01.2014
comment
@Kad: Изглежда, че няма SQL_Latin1_General_CI_AS. По-скоро има Latin1_General_CI_AS. Вижте SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. Има фини разлики по отношение на сортирането и сравнението между двете сортирания. Вижте olcot.co.uk/sql -блогове/. - person Riley Major; 21.04.2014
comment
@Kad: CP1 означава кодова страница 1252. Кодовата страница е справочна таблица за съпоставяне на шестнадесетичната стойност на конкретен знак в набор от знаци. CP1 е съкращение за CP1252 в субкултурата на Microsoft. Windows е единствената платформа, която използва CP1252 местно, тъй като е остатък от дните на DOS. Въпреки че е много подобен на ISO 8859-1, те не са еднакви. Има разлики в картографираните знаци като еврото и няколко други, които не са в ISO 8859-1. - person slartibartfast; 04.02.2017
comment
безупречен отговор @Kris! - person Gaurav; 04.03.2019
comment
@Kris Има ли алтернатива на UTF-8 за SQL_Latin1_General_CP1_CI_AS в SQL2019? - person Chanky Mallick; 18.04.2020
comment
comment
@Kad Както Райли спомена, това съпоставяне не съществува. Името е смесица от двата типа сравнявания: 1) Сравнявания на SQL Server, всички от които имат имена, започващи с SQL_ и включват номера на кодовата страница в името (напр. CP1, CP1255). Те използват по-стари, не-Unicode правила за сортиране/сравняване за VARCHAR данни. 2) Колациите на Windows нямат нито SQL_, нито CP номера в името си. Те използват Unicode правила за сортиране/сравняване за VARCHAR данни. Моля, вижте: sqlquantumleap.com/2019/11/22/ и collations.info - person Solomon Rutzky; 07.06.2021
comment
@slartibartfast Току-що публикувах статия за това как CP1 всъщност е грешка, която не е била открита достатъчно рано, за да бъде поправена, подобно на грешно изписаната referer HTTP заглавка. Това означава ISO-8859-1, въпреки че тази кодова страница не се поддържа никъде в SQL Server, но някой първоначално си помисли, че е синоним на Windows-1252. За всеки, който се интересува, тази публикация е: Какво означава „CP1“ в „SQL_Latin1_General_CP1_CI_AS“?. Освен това 1252 не е от дните на DOS, това ще са 437 и 850. - person Solomon Rutzky; 07.06.2021
comment
@Chanky В зависимост от това какво точно имате предвид под алтернатива, вероятно търсите колацията Latin1_General_100_CI_AS_SC_UTF8. Моля, вижте и моята публикация относно съпоставянето на UTF-8: Собствена поддръжка на UTF-8 в SQL Server 2019: Спасител или фалшив пророк?. - person Solomon Rutzky; 07.06.2021
comment
@SolomonRutzky Да, човече, измина 1 година, опитахме с SQL2019 utf-8 сортиране, за да накараме приложението да поддържа неанглийски, без да променя съществуващите колони varchar, но не беше осъществимо, ограничаването на приложението само до конкретна версия 2019 беше лоша идея, след това преобразувахме цялото нещо в NVARCHAR, беше трудно в сравнение с utf-8, но заслужаваше. - person Chanky Mallick; 01.07.2021

Моля, имайте предвид, че приетият отговор е малко непълен. Да, на най-базовото ниво Collation обработва сортирането. НО правилата за сравнение, определени от избраното съпоставяне, се използват на много места извън потребителските заявки срещу потребителски данни.

Ако "Какво прави COLLATE SQL_Latin1_General_CP1_CI_AS?" означава "Какво прави клаузата COLLATE на CREATE DATABASE?", тогава:

Клаузата COLLATE {collation_name} на израза CREATE DATABASE определя съпоставянето по подразбиране на Базата данни, а не сървъра; Сравняванията по подразбиране на ниво база данни и на ниво сървър контролират различни неща.

Контроли на ниво сървър (т.е. екземпляр):

  • Съпоставяне на ниво база данни за системни бази данни: master, model, msdb и tempdb.
  • Поради контролирането на съпоставянето на ниво DB на tempdb, тогава това е съпоставянето по подразбиране за низови колони във временни таблици (глобални и локални), но не и променливи на таблици.
  • Поради контролирането на съпоставянето на ниво DB на master, това е съпоставянето, използвано за данни на ниво сървър, като например имена на бази данни (т.е. name колона в sys.databases), имена за вход и т.н.
  • Обработка на имена на параметри / променливи
  • Обработка на имена на курсори
  • Обработка на GOTO етикети
  • Подреждане по подразбиране, използвано за новосъздадени бази данни, когато клаузата COLLATE липсва

Контроли на ниво база данни:

  • Подреждане по подразбиране, използвано за новосъздадени низови колони (CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT и NTEXT -- но не използвайте TEXT или NTEXT), когато клаузата COLLATE липсва в дефиницията на колоната. Това важи както за CREATE TABLE, така и за ALTER TABLE ... ADD изявления.
  • Подреждане по подразбиране, използвано за низови литерали (т.е. 'some text') и низови променливи (т.е. @StringVariable). Тази колация се използва само при сравняване на низове и променливи с други низове и променливи. Когато сравнявате низове/променливи с колони, ще се използва съпоставката на колоната.
  • Съпоставянето, използвано за метаданни на ниво база данни, като имена на обекти (т.е. sys.objects), имена на колони (т.е. sys.columns), имена на индекси (т.е. sys.indexes) и др.
  • Колацията, използвана за обекти на ниво база данни: таблици, колони, индекси и др.

Също:

  • ASCII е кодиране, което е 8-битово (за обща употреба; технически "ASCII" е 7-битово със стойности на знаци 0 - 127, а "ASCII Extended" е 8-битово със стойности на знаци 0 - 255). Тази група е една и съща в различните култури.
  • Кодовата страница е "разширената" част от Extended ASCII и контролира кои знаци се използват за стойности 128 - 255. Тази група варира между всяка култура.
  • Latin1 не означава "ASCII", тъй като стандартният ASCII покрива само стойности 0 - 127 и всички кодови страници (които могат да бъдат представени в SQL Server и дори NVARCHAR) картографират тези същите 128 стойности към едни и същи знаци.

Ако "Какво прави COLLATE SQL_Latin1_General_CP1_CI_AS?" означава "Какво прави това конкретно сортиране?", тогава:

  • Тъй като името започва с SQL_, това е сортиране на SQL Server, а не Windows. Те определено са остарели, дори и да не са официално отхвърлени, и са главно за съвместимост преди SQL Server 2000. Въпреки че, за съжаление, SQL_Latin1_General_CP1_CI_AS е много често срещан, тъй като е по подразбиране при инсталиране на операционна система, използваща американски английски като език. Тези сравнявания трябва да се избягват, ако изобщо е възможно.

    Сортирането на Windows (тези с имена не започващи с SQL_) са по-нови, по-функционални, имат последователно сортиране между VARCHAR и NVARCHAR за едни и същи стойности и се актуализират с допълнителни/коригирани тегла на сортиране и главни/малки букви съпоставяния. Тези съпоставки също нямат потенциалния проблем с производителността, който имат съпоставките на SQL Server: Въздействие върху индексите при смесване на типове VARCHAR и NVARCHAR.

  • Latin1_General is the culture / locale.
    • For NCHAR, NVARCHAR, and NTEXT data this determines the linguistic rules used for sorting and comparison.
    • For CHAR, VARCHAR, and TEXT data (columns, literals, and variables) this determines the:
      • linguistic rules used for sorting and comparison.
      • кодова страница, използвана за кодиране на знаците. Например Latin1_General съпоставянето използва кодова страница 1252, Hebrew съпоставянето използва кодова страница 1255 и т.н.
  • CP{code_page} or {version}

    • For SQL Server collations: CP{code_page}, is the 8-bit code page that determines what characters map to values 128 - 255. While there are four code pages for Double-Byte Character Sets (DBCS) that can use 2-byte combinations to create more than 256 characters, these are not available for the SQL Server collations.
    • За сортиране на Windows: {version}, въпреки че не присъства във всички имена на сортиране, се отнася до версията на SQL Server, в която сортирането е въведено (в по-голямата си част). Колациите на Windows без номер на версията в името са версия 80 (което означава SQL Server 2000, тъй като това е версия 8.0). Не всички версии на SQL Server идват с нови сортировки, така че има пропуски в номерата на версиите. Има някои, които са 90 (за SQL Server 2005, който е версия 9.0), повечето са 100 (за SQL Server 2008, версия 10.0), а малък набор има 140 (за SQL Server 2017, версия 14.0).

      Казах „в по-голямата си част“, ​​защото съпоставките, завършващи на _SC, бяха въведени в SQL Server 2012 (версия 11.0), но основните данни не бяха нови, те просто добавиха поддръжка за допълнителни знаци за вградените функции. И така, тези окончания съществуват за версии 90 и 100 съпоставки, но само като се започне от SQL Server 2012.

  • Next you have the sensitivities, that can be in any combination of the following, but always specified in this order:
    • CS = case-sensitive or CI = case-insensitive
    • AS = чувствителен към акцент или AI = нечувствителен към акцент
    • KS = Kana е чувствителен към типа или липсва = Kana е нечувствителен към типа
    • WS = чувствителен към ширина или липсващ = нечувствителен към ширина
    • VSS = селекторът на варианти е чувствителен (наличен само във версия 140 съпоставки) или липсва = селекторът на вариант е нечувствителен
  • Последна част по избор:

    • _SC at the end means "Supplementary Character support". The "support" only affects how the built-in functions interpret surrogate pairs (which are how supplementary characters are encoded in UTF-16). Without _SC at the end (or _140_ in the middle), built-in functions don't see a single supplementary character, but instead see two meaningless code points that make up the surrogate pair. This ending can be added to any non-binary, version 90 or 100 collation.
    • _BIN или _BIN2 в края означава "двоично" сортиране и сравнение. Данните все още се съхраняват същите, но няма лингвистични правила. Този край никога не се комбинира с някоя от 5-те чувствителност или _SC. _BIN е по-старият стил, а _BIN2 е по-новият, по-точен стил. Ако използвате SQL Server 2005 или по-нов, използвайте _BIN2. За подробности относно разликите между _BIN и _BIN2, моля, вижте: Разлики между различните двоични съпоставки (култури, версии и BIN срещу BIN2).
    • _UTF8 е нова опция от SQL Server 2019. Това е 8-битово кодиране, което позволява Unicode данни да се съхраняват в VARCHAR и CHAR типове данни (но не и отхвърления TEXT тип данни). Тази опция може да се използва само за съпоставки, които поддържат допълнителни знаци (т.е. съпоставки версия 90 или 100 с _SC в името им и съпоставки версия 140). Има и единично двоично _UTF8 съпоставяне (_BIN2, не _BIN).

      МОЛЯ, ОБЪРНЕТЕ ВНИМАНИЕ: UTF-8 е проектиран / създаден за съвместимост със среди / код, които са настроени за 8-битово кодиране, но искат да поддържат Unicode. Въпреки че има няколко сценария, при които UTF-8 може да осигури до 50% спестяване на пространство в сравнение с NVARCHAR, това е страничен ефект и има цена на лек удар върху производителността в много/повечето операции. Ако имате нужда от това за съвместимост, тогава цената е приемлива. Ако искате това за спестяване на място, по-добре тествайте и ТЕСТВАЙТЕ ОТНОВО. Тестването включва цялата функционалност и повече от няколко реда данни. Имайте предвид, че UTF-8 сортирането работи най-добре, когато ВСИЧКИ колони и самата база данни използват VARCHAR данни (колони, променливи, низови литерали) с _UTF8 сортиране. Това е естественото състояние за всеки, който използва това за съвместимост, но не и за тези, които се надяват да го използват за спестяване на място. Бъдете внимателни, когато смесвате VARCHAR данни, използвайки _UTF8 съпоставяне с VARCHAR данни, използващи не-_UTF8 съпоставяне или NVARCHAR данни, тъй като може да изпитате странно поведение/загуба на данни. За повече подробности относно новите съпоставки на UTF-8, моля, вижте: Собствена поддръжка на UTF-8 в SQL Server 2019: Спасител или фалшив пророк?

person Solomon Rutzky    schedule 01.12.2016
comment
Въпреки че гласувах за това, защото съдържа толкова много информация и усилия, отговорът ми определено не е грешен (базите данни съхраняват данни, сървърите на бази данни действат върху тези данни, сортирането действа). Избрах краткостта пред пълната математическа точност, защото ОП вероятно търсеше достатъчно, а не цялата възможна информация. - person Kris; 14.09.2017
comment
Здравей @Kris. Благодаря. За да бъда честен, не казах, че отговорът ви е напълно грешен, просто ужасно непълен. Актуализирах, за да се надявам да изясня това. Разбирам какво казвате, но OP попита какво прави клаузата COLLATE на CREATE DATABASE. Казахте едно от няколкото неща, които прави. Защо предполагате, че ОП иска да знае само 10% от отговора? Ако цялата информация е представена, всеки може да реши колко от нея да приеме. Но ако се даде само някаква информация, значи изборът е направен за тях. Избирам да предоставя възможно най-много информация, защото повечето от нея не са добре известни. (продължение) - person Solomon Rutzky; 15.09.2017
comment
Що се отнася до съпоставянето (и кодирането), повечето от това, което е там, е или непълно, или неправилно. Така че повечето хора си тръгват, без да знаят достатъчно или да си мислят, че знаят нещо, но грешат напълно. Хората вземат по-добри решения, когато разполагат с цялата информация, така че намирам за най-добре да предложа възможно най-пълен отговор. Избирайки краткост, вие потенциално оставяте читателите объркани, когато получат грешки при анализ и т.н. в DB с чувствително към малки и главни букви или двоично съпоставяне, тъй като разделителната способност на имената не е спомената. Така че макар да сте прав за сортирането, смятам, че само по себе си е подвеждащо. - person Solomon Rutzky; 15.09.2017
comment
Мисля, че разбирам какво имате предвид, но се стремя да дам достатъчно информация, а не твърде много. твърде много информация бързо става твърде сложна за много хора. и когато не успея да дам достатъчно информация за някакво обстоятелство, ще очаквам последващи въпроси. (Аз също не очаквах толкова много внимание към темата) - person Kris; 16.09.2017
comment
@Kris От известно време се каня да кажа Благодаря! за проявената зрялост и професионализъм. Донякъде съм свикнал с хората, които се обиждат лично на някого, казвайки, че греши, и след това стават трудни (или дори по-трудни) за общуване. Но вашият премерен отговор на моя, приетият отговор е ГРЕШЕН ме вдъхнови да смекча интрото си и трябва да служи като пример на другите тук как да общуват правилно и продуктивно ????. - person Solomon Rutzky; 14.08.2018
comment
Добре дошли сте и се радвам да чуя, че по някакъв начин съм оказал положително въздействие, но ми е приятно да греша, това отваря възможности за научаване на нови неща, което е страхотно! - person Kris; 14.08.2018

CP1 означава „Кодова страница 1“ - технически това се превежда като кодова страница 1252

person Chris Halcrow    schedule 29.04.2013

Ключовата дума COLLATE указва какъв вид набор от знаци и правила (ред, правила за конфронтация) използвате за низови стойности.

Например във вашия случай използвате латински правила с нечувствителни към главни и малки букви (CI) и чувствителни към ударения (AS)

Можете да се обърнете към тази документация

person il_guru    schedule 18.02.2011

Това определя сортирането по подразбиране за базата данни. Всяко текстово поле, което създавате в таблици в базата данни, ще използва това сортиране, освен ако не посочите друго.

Базата данни винаги има сортиране по подразбиране. Ако не посочите нито един, се използва сортирането по подразбиране на екземпляра на SQL Server.

Името на сортирането, което използвате, показва, че то използва латинската1 кодова страница 1, не е чувствително към главни и малки букви (CI) и чувствително към акцент (AS). Това сортиране се използва в САЩ, така че ще съдържа правила за сортиране, които се използват в САЩ.

Подреждането решава как текстовите стойности се сравняват за равенство и подобие и как се сравняват при сортиране. Кодовата страница се използва при съхраняване на не-уникод данни, напр. varchar полета.

person Guffa    schedule 18.02.2011
comment
грешно (не можете not да посочите съпоставяне, въпреки че можете да приемете стойността по подразбиране) грешно (използва се и за unicode данни) - person RichardTheKiwi; 18.02.2011
comment
@Richard aka cyberkiwi: Проверете документацията: msdn.microsoft.com/en-us /library/ms176061.aspx Указването на сортирането е по избор. Кодовата страница не се използва за съхраняване на Unicode данни, тъй като те се съхраняват като 16-битови Unicode кодови точки, а не като 8-битови индекси на кодови страници. - person Guffa; 18.02.2011
comment
Прочетох грешно отговора ви, но пак е грешен. Базата данни винаги има сортиране по подразбиране = Сортиране на СЪРВЪР, а не конкретно Latin1_General_CI_AS. Сега го прочетох погрешно, защото наполовина очаквах изявлението да е за СЪРВЪРНО съпоставяне, което изисква приемане на по подразбиране в потребителския интерфейс. За 2-ра точка изглежда намеквате, че сортирането не се използва за сортиране на данни в уникод (въпреки че превключвате от sorting на storing в последните 2 изречения). Текстовите данни в Unicode също се подчиняват на сортирането. - person RichardTheKiwi; 18.02.2011
comment
@Richard aka cyberkiwi: Промених параграфа за сортирането по подразбиране, за да съответства на конкретната документация, към която направих връзка. (Различава се в зависимост от версията на сървъра.) Що се отнася до втората точка, не виждам как мога да я направя по-ясна. В текста се казва, че кодовата страница се използва при съхраняване на данни, различни от уникод. Кодовата страница не се използва за определяне на сортирането, нито за уникод данни, нито за не-уникод данни. - person Guffa; 18.02.2011