SQL Server: установка набора символов (не сортировка)
Как установить набор символов по умолчанию для полей при создании таблиц в SQL Server? В MySQL это делается:
CREATE TABLE tableName (
name VARCHAR(128) CHARACTER SET utf8
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Обратите внимание, что здесь я устанавливаю набор символов дважды. Это избыточно, я добавил оба способа, чтобы продемонстрировать.
Я также установил сопоставление, чтобы продемонстрировать, что сопоставление является чем-то другим. Я не спрашиваю о настройке сортировки. Большинство questions, спрашивающих о наборах символов и кодировках в SQL Server, отвечает с помощью сортировки, которая не является такой же предмет.
Ответы
Ответ 1
Как указано в BOL
Каждая сортировка SQL Server определяет три свойства:
- Порядок сортировки для использования для типов данных Unicode (nchar, nvarchar и ntext). Порядок сортировки определяет последовательность, в которой символы сортировка и способ оценки символов в операциях сравнения.
- Порядок сортировки, используемый для символьных типов данных, отличных от Юникода (char, varchar и text).
- Страница кода, используемая для хранения символьных данных, отличных от Юникода.
Цитата выше - от 2000 документов. См. также эту ссылку 2008 года. Ниже также показано это.
DECLARE @T TABLE
(
code TINYINT PRIMARY KEY,
Arabic_CS_AS CHAR(1) COLLATE Arabic_CS_AS NULL,
Cyrillic_General_CS_AS CHAR(1) COLLATE Cyrillic_General_CS_AS NULL,
Latin1_General_CS_AS CHAR(1) COLLATE Latin1_General_CS_AS NULL
);
INSERT INTO @T(code) VALUES (200),(201),(202),(203),(204),(205)
UPDATE @T
SET Arabic_CS_AS=CAST(code AS BINARY(1)),
Cyrillic_General_CS_AS=CAST(code AS BINARY(1)),
Latin1_General_CS_AS=CAST(code AS BINARY(1))
SELECT *
FROM @T
Результаты
code Arabic_CS_AS Cyrillic_General_CS_AS Latin1_General_CS_AS
---- ------------ ---------------------- --------------------
200 ب И È
201 ة Й É
202 ت К Ê
203 ث Л Ë
204 ج М Ì
205 ح Н Í
Ответ 2
Чтобы расширить ответ на @Martin:
Как вы устанавливаете "набор символов" в SQL Server, зависит от типа данных, который вы используете. Если вы используете:
-
NVARCHAR
, NCHAR
и NTEXT
(NTEXT
устарел и не должен использоваться как SQL Server 2005), все используют набор символов Unicode, и это нельзя изменить. Эти типы данных кодируются как UTF-16 LE (Little Endian) – 16-битовое кодирование с каждым "символом", имеющим либо 2, либо 4 байта – и это тоже нельзя изменить. Для этих типов данных используемая сортировка влияет только на локаль (как определено LCID сортировки), которая определяет набор правил, используемых для сортировки и сравнения.
-
XML
, как и типы N
-prefixed, использует набор символов Unicode и кодируется как UTF-16 LE (Little Endian), и ни один из них не может быть изменен. Но в отличие от других строковых типов данных нет сортировки, связанной с данными XML
, поскольку ее нельзя сортировать или сравнивать (по крайней мере, не переведя ее сначала в NVARCHAR(MAX)
[предпочтительно] или VARCHAR(MAX)
).
-
VARCHAR
, CHAR
и TEXT
(TEXT
устарел и не должен использоваться как SQL Server 2005) - все 8-битные кодировки с каждым символом, равным 1 или 2 байта. Набор символов определяется кодовой страницей, связанной с каждой сортировкой. Правила сортировки и сравнения зависят от типа используемой сортировки:
- SQL Server Collations: все они имеют имена, начинающиеся с
SQL_
и устаревшие с SQL Server 2000, хотя, к сожалению, все еще широко используются сегодня. Они используют простые правила, обозначенные как "порядок сортировки SQL Server", как указано в поле description
, возвращаемом sys.fn_helpcollations()
.
- Коллапы Windows: все они имеют имена, которые не начинаются с
SQL_
. Эти Collations позволяют строковым данным, отличным от Unicode, использовать правила сортировки и сравнения Юникода, указанные LCID в сортировке.
Чтобы узнать, какой набор символов (для CHAR
, VARCHAR
и TEXT
– то есть данные, не относящиеся к Unicode –), выполните следующий запрос и обратите пристальное внимание на поле CodePage
. Поле LCID
указывает язык, используемый для правил сортировки и сравнения для N
-prefixed – то есть Unicode – типы, а также типы, отличные от Unicode, при использовании сортировки Windows:
SELECT *,
COLLATIONPROPERTY(col.[name], 'CodePage') AS [CodePage],
COLLATIONPROPERTY(col.[name], 'LCID') AS [LCID]
FROM sys.fn_helpcollations() col
ORDER BY col.[name];
Идентификаторы кодовой страницы могут быть переведены на что-то более значимое на странице MSDN для Идентификаторы кодовой страницы.
Относительно O.P. comment в ответе @Martin:
К сожалению, они выбрали вводящий в заблуждение/неполный термин "сопоставление", который явно относится к порядку сортировки: определение сортировки.
Хотя это правда, что Microsoft могла бы сделать лучше при выборе имени, есть, к сожалению, общая путаница в отрасли по таким терминам, как "кодирование", "набор символов" , "сортировка" и т.д. Microsoft использует ( или неправильное использование) "Collation" просто способствовало массовому путанице. Но эта путаница также проявляется в MySQL, как показано в этом вопросе, учитывая, что "utf8" специально не является набором символов; -).
UTF-8 является одним из нескольких кодировок для набора символов Unicode. UTF-16 и UTF-32 являются двумя другими кодировками. Все три из этих кодировок представляют собой тот же набор символов Юникода, по-разному. Глядя на список наборов символов MySQL – 11.1.10 Поддерживаемые наборы символов и сортировки – "ucs2", "utf8" , "utf8mb4", "utf16", "utf16le", "utf32" кодировки на самом деле не являются наборами символов, но различными представлениями набора символов Unicode. Но, учитывая совпадение понятий "набор символов" и "кодирование", было бы трудно не иметь этой путаницы. Клавиша 11.1.10.1 Unicode Character Sets показывает, что кодировки "utf8mb4", "utf16", "utf16le" и "utf32" являются полный набор символов Юникода, в то время как "ucs2" и "utf8" являются подмножествами набора символов Юникода, в частности, первые 65 536 кодовых точек (также называемых Basic Multilingual Plane (BMP)).
Для получения дополнительной информации о сортировке по различным РСУБД см. мой ответ на следующий вопрос в DBA.StackExchange:
Имеет ли какая-либо СУБД сортировку, которая чувствительна к регистру и не требует акцента?