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:

Имеет ли какая-либо СУБД сортировку, которая чувствительна к регистру и не требует акцента?