Что делает 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
.
Может кто-нибудь объяснить это мне? Кроме того, я хотел бы знать, является ли создание базы данных таким образом наилучшей практикой?
Ответы
Ответ 1
Он устанавливает, как сервер базы данных сортирует (сравнивает фрагменты текста). в этом случае:
SQL_Latin1_General_CP1_CI_AS
разбивается на интересные части:
latin1
заставляет сервер обрабатывать строки, используя charset latin 1, в основном ascii
CP1
обозначает кодовую страницу 1252
CI
сравнения без учета регистра, поэтому "ABC" будет равно "abc"
AS
чувствителен к акценту, поэтому 'ü' не равно 'u'
P.S. Для получения более подробной информации обязательно прочитайте ответ @solomon-rutzky.
Ответ 2
Помните, что принятый ответ немного неполон. Да, на самом базовом уровне Collation обрабатывает сортировку. НО, правила сравнения, определенные выбранным сопоставлением, используются во многих местах вне пользовательских запросов к пользовательским данным.
Если "Что делает COLLATE SQL_Latin1_General_CP1_CI_AS
?" означает "Что делает предложение COLLATE
в CREATE DATABASE
?", то:
Предложение COLLATE {collation_name}
оператора CREATE DATABASE
определяет сортировку базы данных по умолчанию, а не сервера; Параметры сортировки по умолчанию для базы данных -level и сервера -level контролируют разные вещи.
Сервер (т.е. экземпляр) -level контролирует:
- База данных -level Сортировка для системных баз данных:
master
, model
, msdb
и tempdb
.
- Благодаря контролю параметров сортировки БД -level для
tempdb
, в этом случае используется параметр сортировки по умолчанию для строковых столбцов во временных таблицах (глобальных и локальных), но не в переменных таблицы.
- Благодаря контролю параметров сортировки БД -level для
master
, в таком случае они используются для данных сервера -level, таких как имена баз данных (т.е. столбец name
в sys.databases
), имена входа и т.д.
- Обработка имен параметров/переменных
- Обработка имен курсоров
- Обработка ярлыков
GOTO
- Сортировка по умолчанию, используемая для вновь создаваемых баз данных, когда отсутствует условие
COLLATE
База данных -level контролирует:
- Параметры сортировки по умолчанию, используемые для вновь созданных строковых столбцов (
CHAR
, VARCHAR
, NCHAR
, NVARCHAR
, TEXT
и NTEXT
- но не используйте TEXT
или NTEXT
), когда Предложение COLLATE
отсутствует в определении столбца. Это относится как к операторам CREATE TABLE
, так и к ALTER TABLE ... ADD
.
- Сортировка по умолчанию, используемая для строковых литералов (т.е.
'some text'
) и строковых переменных (т.е. @StringVariable
). Это сопоставление всегда используется только при сравнении строк и переменных с другими строками и переменными. При сравнении строк/переменных со столбцами будет использоваться сопоставление столбца.
- Сортировка, используемая для метаданных базы данных -level, таких как имена объектов (то есть
sys.objects
), имена столбцов (то есть sys.columns
), имена индексов (то есть sys.indexes
) и т.д.
- Параметры сортировки, используемые для объектов базы данных -level: таблиц, столбцов, индексов и т.д.
Также:
- 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), которые могут использовать 2-байтовые комбинации для создать более 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_
в середине) встроенные функции не видят ни одного дополнительного символа, а вместо этого видят две бессмысленные кодовые точки, которые составляют суррогатную пару. Это окончание может быть добавлено в любой двоичный файл non-, версия 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
с использованием параметров сортировки non- _UTF8
или данных NVARCHAR
, так как вы можете столкнуться со странным поведением/потерей данных. Дополнительные сведения о новых сопоставлениях UTF-8 см. в разделе: Собственная поддержка UTF-8 в SQL Server 2019: Спаситель или Лжепророк?
Ответ 3
CP1 означает "Code Page 1" - технически это переводится на кодовую страницу 1252
Ответ 4
Ключевое слово COLLATE определяет, какой набор символов и правила (порядок, конфронтационные правила) используются для строковых значений.
Например, в вашем случае вы используете латинские правила с нечувствительным к регистру (CI) и чувствительным к акценту ( AS)
Вы можете обратиться к этой Документации
Ответ 5
Указывает сопоставление по умолчанию для базы данных. Каждое текстовое поле, которое вы создаете в таблицах в базе данных, будет использовать эту сортировку, если вы не укажете другую.
База данных всегда имеет сортировку по умолчанию. Если вы не указали какие-либо значения, используется сортировка по умолчанию экземпляра SQL Server.
В названии используемой сопоставления показано, что он использует кодовую страницу Latin1, не чувствителен к регистру (CI) и чувствителен к акценту (AS). Эта сортировка используется в США, поэтому она будет содержать правила сортировки, которые используются в США.
Количественное решение решает, как сравниваются текстовые значения для равенства и подобия, и как они сравниваются при сортировке. Кодовая страница используется при хранении данных, отличных от юникода, например. varchar.