Что делает «COLLATE SQL_Latin1_General_CP1_CI_AS»? - PullRequest
109 голосов
/ 18 февраля 2011

У меня есть 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.

Может кто-нибудь объяснить это мне?Кроме того, я хотел бы знать, является ли создание базы данных таким способом наилучшей практикой?

Ответы [ 5 ]

213 голосов
/ 18 февраля 2011

Устанавливает порядок сортировки сервера базы данных.в этом случае:

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 .

43 голосов
/ 01 декабря 2016

Обратите внимание, что принятый ответ немного неполон.Да, на самом базовом уровне Collation обрабатывает сортировку.НО, правила сравнения, определенные выбранным сопоставлением, используются во многих местах вне пользовательских запросов к пользовательским данным.

Если "Что делает COLLATE SQL_Latin1_General_CP1_CI_AS?"означает «Что делает предложение COLLATE CREATE DATABASE?», тогда:

Предложение COLLATE {collation_name} оператора CREATE DATABASE задает параметры сортировки по умолчанию База данных не Сервер;Параметры сортировки по умолчанию на уровне базы данных и на уровне сервера управляют разными вещами.

Уровень сервера (т. Е. Экземпляра) управляет:

  • Параметры сортировки на уровне базы данных для системных баз данных: master, model, msdb и tempdb.
  • Из-за контроля параметров сортировки на уровне базы данных в tempdb в этом случае по умолчанию для столбцов строк во временных таблицах используется значение по умолчанию (глобальные и локальные), но не табличные переменные.
  • Благодаря контролю параметров сортировки на уровне базы данных master, в этом случае параметры сортировки используются для данных уровня сервера , таких как база данных.имена (т. е. name столбец в sys.databases), имена для входа и т. д.
  • обработка имен параметров / переменных
  • обработка имен курсоров
  • обработка GOTO tags
  • Сортировка по умолчанию, используемая для вновь создаваемых баз данных, когда отсутствует условие 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 - это культура /локали.
    • Для данных 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 = кана чувствительна к типу или отсутствует = кана нечувствительна к типу
    • 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 в SQL Server 2019: Спаситель или Лжепророк?

23 голосов
/ 30 апреля 2013

CP1 означает «кодовая страница 1» - технически это означает кодовую страницу 1252

15 голосов
/ 18 февраля 2011

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

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

Вы можете обратиться к этому Документация

8 голосов
/ 18 февраля 2011

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

База данных всегда имеет параметры сортировки по умолчанию. Если вы ничего не указали, используется сопоставление по умолчанию для экземпляра SQL Server.

Название используемого сопоставления показывает, что оно использует кодовую страницу Latin1 1, нечувствительно к регистру (CI) и регистром (AS). Это сопоставление используется в США, поэтому оно будет содержать правила сортировки, используемые в США.

Сортировка решает, как сравниваются текстовые значения для равенства и подобия, и как они сравниваются при сортировке. Кодовая страница используется при хранении данных, не относящихся к Юникоду, например, поля Varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...