Що робить "COLLATE SQL_Latin1_General_CP1_CI_AS"?


134

У мене є 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.

Хтось може мені це пояснити? Також я хотів би знати, чи створення бази даних таким чином є найкращою практикою?

Відповіді:


246

Він встановлює спосіб сортування сервера баз даних (порівнює фрагменти тексту). в цьому випадку:

SQL_Latin1_General_CP1_CI_AS

розбивається на цікаві частини:

  1. latin1 змушує сервер обробляти рядки, використовуючи charset latin 1, в основному, ascii
  2. CP1 означає Код сторінки 1252
  3. CI порівняння у випадку нечутливих випадків, так 'ABC' дорівнюватиме 'abc'
  4. AS наголос чутливий, тому "ü" не дорівнює "u"

PS Для отримання більш детальної інформації обов'язково прочитайте відповідь @ solomon-rutzky .


11
Яка була б різниця між цим та SQL_Latin1_General_CI_AS. Зокрема, CP1 мене здивував.
Кад

7
@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-blogs/… .
Майор Райлі

4
@Kad: CP1 розшифровується як код сторінки 1252. Кодова сторінка - це таблиця пошуку, щоб зіставити шістнадцяткове значення конкретного символу в наборі символів. CP1 - це скорочення для CP1252 в підкультурі Microsoft. Windows - це єдина платформа, яка використовує CP1252 корінно, оскільки вона перетримує DOS-дні. Хоча він дуже схожий на ISO 8859-1, вони не однакові. Існують відмінності у відображених символах на зразок євро та кількох інших, які відсутні в ISO 8859-1.
slartibartfast

бездоганна відповідь @Kris!
gaurav

@Kris Чи є альтернатива UTF-8 для SQL_Latin1_General_CP1_CI_AS у SQL2019?
Чанкі

72

Зауважте, що прийнята відповідь трохи неповна. Так, на самому базовому рівні Collation здійснює сортування. Але НЕ, правила порівняння, визначені вибраним зіставленням, використовуються в багатьох місцях поза запитами користувачів щодо даних користувачів.

Якщо "Що COLLATE SQL_Latin1_General_CP1_CI_ASробити?" означає "Що означає COLLATEзастереженняCREATE DATABASE ?", то:

У COLLATE {collation_name}пункті CREATE DATABASEоператора вказано стандартне зіставлення бази даних , а не сервер; Збірники рівня баз даних та рівня сервера за замовчуванням контролюють різні речі.

Елементи управління на рівні сервера (тобто екземпляра) :

  • База даних рівня Collation для системних баз даних: master, model, msdb, іtempdb .
  • Завдяки контролю зіставлення рівня DB tempdb , тоді це зіставлення за замовчуванням для рядкових стовпців у тимчасових таблицях (глобальних та локальних), але не змінних таблиць.
  • Завдяки керуванню зіставленням на рівні DB master, це Collation використовується для даних рівня сервера , таких як імена бази даних (тобто nameстовпчик у sys.databases), імена входу тощо.
  • Обробка імен параметрів / змінних
  • Обробка імен курсору
  • Поводження з GOTOетикетками
  • Збір за замовчуванням, що використовується для новостворених баз даних, коли COLLATEпункт відсутній

Елементи управління базою даних :

  • За замовчуванням Collation використовується для новостворених строкових стовпців ( 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). Ця група однакова для культур.
  • Сторінка коду - це "розширена" частина розширеного 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 є культура / локаль.
    • Для NCHAR, NVARCHARта NTEXTданих це визначає мовні правила, які використовуються для сортування та порівняння.
    • Для CHAR , VARCHARта TEXTданих (стовпці, літерали та змінні) це визначає:
      • лінгвістичні правила, що використовуються для сортування та порівняння.
      • сторінка коду, що використовується для кодування символів. Наприклад, для Latin1_Generalпорівнянь використовується кодова сторінка 1252, для Hebrewпорівнянь використовується сторінка коду 1255 тощо.
  • CP{code_page} або {version}

    • Для посилань на SQL Server :, CP{code_page}це 8-бітова сторінка коду, яка визначає, які символи відображаються у значеннях 128 - 255. Хоча існують чотири сторінки коду для двобайтних наборів символів (DBCS), які можуть використовувати двобайтові комбінації для створення більше, ніж 256 символів, вони недоступні для порівнянь на SQL Server.
    • Для зіставлень 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.

  • Далі ви маєте чутливість, яка може бути в будь-якій комбінації з наступного, але завжди вказана в цьому порядку:
    • CS= залежно від регістру або CI= нечутливе до регістру
    • AS= чутливий до AIакценту або = нечутливий до акцентів
    • KS = Чутливий до типу Kana або відсутній = нечутливий до типу Kana
    • WS = чутливий до ширини або відсутній = нечутливий до ширини
    • VSS = чутливий до селектора варіацій (доступний лише у порівнянні версії 140) або відсутній = селектор варіації нечутливий
  • Необов’язковий останній фрагмент:

    • _SCв кінці означає "Додаткова підтримка символів". "Підтримка" впливає лише на те, як вбудовані функції інтерпретують сурогатні пари (які є тим, як додаткові символи закодовані в UTF-16). Без _SCкінця (або _140_в середині) вбудовані функції не бачать жодного додаткового символу, а натомість бачать дві безглузді кодові точки, що складають сурогатну пару. Цей закінчення може бути доданий до будь-якого небінарного порівняння версії 90 або 100.
    • _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 Native в SQL Server 2019: рятівник чи помилковий пророк?


5
Хоча я заперечував за тим, щоб містити стільки інформації та зусиль, моя відповідь, безумовно, не помилкова (бази даних зберігають дані, сервери баз даних діють на ці дані, сортування діє). Я вибрав стислість над повною математичною точністю, оскільки ОП, ймовірно, шукав достатню кількість не всієї можливої ​​інформації.
Кріс

4
Привіт @Kris. Дякую. Якщо чесно, я не сказав, що ваша відповідь була абсолютно неправильною, просто жахливо неповною. Я оновив, щоб сподіватись уточнити це. Я отримую то , що ви говорите, але ОП запитав , що COLLATEрозділ CREATE DATABASEробить. Ви сказали одну з кількох речей, які це робить. Чому ви вважаєте, що ОП хоче знати лише 10% відповіді? Якщо представлена ​​вся інформація, кожна людина може вирішити, скільки її взяти. Але якщо дається лише якась інформація, то вибір був зроблений саме для них. Я вирішую надати якомога більше інформації, оскільки більшість її не відома. (продовження)
Соломон Руцький

5
Я думаю, я бачу, що ви маєте на увазі, але я прагну дати достатню кількість інформації, а не занадто багато. занадто багато інформації швидко стає надто складною для багатьох людей. і коли я не можу дати достатньо інформації для будь-яких обставин, я очікую наступних питань. (Я також не очікував такої великої уваги до теми)
Кріс,

8
@Kris Я мав на увазі деякий час сказати "Спасибі!" за прояв такої зрілості та професіоналізму. Я дещо звик до того, що люди переживають особисті образи на когось, кажучи, що вони помиляються, а потім стають «важкими» (або ще складніше) взаємодіяти. Але ваша мірна відповідь на мою "прийняту відповідь НЕПРАВИЛЬНА " надихнула мене на тональність мого вступу і повинна слугувати прикладом для інших, як правильно та продуктивно спілкуватися 😺.
Соломон Руцький

4
Ви раді і приємно почути, що я якось позитивно вплинув, але мені подобається бути "неправильним", це відкриває можливості для вивчення нового, що чудово!
Кріс


16

КОПІЇ ключового слова вказати , який набір символів і правил (порядку, правила протиборства) використовується для строкових значень.

Наприклад, у вашому випадку ви використовуєте латинські правила з нечутливими до регістру ( CI ) та чутливими до акценту ( AS )

Ви можете посилатися на цю Документацію


9

Це визначає порівняння за замовчуванням для бази даних. Кожне текстове поле, яке ви створюєте в таблицях бази даних, використовуватиме це зіставлення, якщо ви не вказали інше.

База даних завжди має порівняння за замовчуванням. Якщо ви не вказали жодного, використовується порівняння за замовчуванням для екземпляра SQL Server.

Назва використовуваного порівняння показує, що він використовує код 1 сторінки Latin1, нечутливий до регістру (CI) та чутливий до акценту (AS). Це порівняння використовується в США, тому воно буде містити правила сортування, які використовуються в США.

Збір визначає, як текстові значення порівнюються за рівність та подобу та як їх порівнювати під час сортування. Сторінка коду використовується при зберіганні даних, що не є кодами, наприклад, поля varchar.


неправильно (ви не можете notвказати зіставлення, хоча ви можете прийняти за замовчуванням) неправильно (він використовується і для даних про unicode)
RichardTheKiwi

@Richard ака cyberkiwi: Перевірте документацію: msdn.microsoft.com/en-us/library/ms176061.aspx Завдання звірка є необов'язковим. Сторінка коду не використовується для зберігання даних Unicode, оскільки вона зберігається як 16-бітні точки коду Unicode, а не як 8-бітові індекси кодової сторінки.
Гуффа

Я неправильно прочитав вашу відповідь, але вона все-таки неправильна. У базі даних завжди є зіставлення за замовчуванням = порівняння SERVER , а не конкретно Latin1_General_CI_AS. Тепер я прочитав це неправильно, тому що я наполовину очікував, що заява стосується порівняння SERVER, що вимагає прийняття за замовчуванням у інтерфейсі користувача. З другого пункту ви, мабуть, маєте на увазі, що порівняння не використовується для сортування даних унікоду (навіть якщо ви переходите sortingдо storingостанніх 2 речень). Текстові дані Unicode також підкоряються зіставленням.
RichardTheKiwi

@Richard aka cyberkiwi: Я змінив абзац про зіставлення за замовчуванням, щоб він відповідав конкретній документації, до якої я пов’язаний. (Він відрізняється залежно від версії сервера.) Щодо другого пункту, я не можу зрозуміти, як я міг би зробити його більш зрозумілим. У тексті йдеться про те, що сторінка коду використовується при зберіганні даних без унікоду. Кодова сторінка не використовується для визначення сортування, ні для даних unicode, ні для даних unicode.
Гуффа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.