SQL Server: набор символов (не параметры сортировки)

Как установить набор символов по умолчанию для полей при создании таблиц в SQL Server? В MySQL один делает это:

CREATE TABLE tableName (
    name VARCHAR(128) CHARACTER SET utf8
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

обратите внимание, что я установил набор символов дважды здесь. Это излишне, я добавил оба способа, чтобы просто продемонстрировать.

установить параметры сортировки также показать, что обобщение-это нечто другое. Я не вопрос о настройке сортировки. большинство вопросы спрашивать о наборах символов и кодировки в SQL Server отвечают сортировкой, которая является не то же самое.

2 ответов


как указано в BOL

каждая сортировка SQL Server задает три свойства:

  • порядок сортировки, используемый для типов данных Unicode (nchar, nvarchar и ntext). Порядок сортировки определяет последовательность символов сортировка и способ вычисления символов в операциях сравнения.
  • порядок сортировки, используемый для символьных типов данных, отличных от Юникода (char, varchar и text).
  • код страница, используемая для хранения символьных данных, отличных от Unicode.

цитата выше из 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  ح            Н                      Í

чтобы расширить ответ @Martin:

способ установки "набора символов" в SQL Server зависит от используемого типа данных. Если вы используете:

  • NVARCHAR, NCHAR и NTEXT (NTEXT устарел и не должен использоваться с SQL Server 2005) все используют набор символов Unicode, и это не может быть изменено. Все эти типы данных кодируются как UTF-16 LE (Little Endian) - 16-битная кодировка с каждым "символом", равным 2 или 4 байтам - и это тоже нельзя изменить. Для этих типов данных используемая сортировка влияет только на локаль (определяемую LCID сортировки), которая определяет набор правил, используемых для сортировки и сравнения.

  • XML, как N-типы с префиксами, использует набор символов Юникода и кодируется как UTF-16 LE (Little Endian), и ни один из них не может быть изменен. Но в отличие от других строковых типов данных, нет параметров сортировки, связанных с XML данные, поскольку они не могут быть отсортированы или сопоставлены (по крайней мере, без предварительного преобразования в NVARCHAR(MAX) [крупный] или VARCHAR(MAX) ).

  • VARCHAR, CHAR и TEXT (TEXT устарел и не должен использоваться с SQL Server 2005)-все 8-битные кодировки с каждым "символом", равным 1 или 2 байтам. Набор символов определяется кодовой страницей, связанной с каждым параметром сортировки. Правила сортировки и сравнения зависят от типа сортировки используется:

    • параметры сортировки SQL Server: все они имеют имена, начинающиеся с SQL_ и устарели с SQL Server 2000, хотя (к сожалению) все еще широко используются сегодня. Они используют простые правила, указанные как номер "порядок сортировки SQL Server", как найдено в на @Мартин:

      к сожалению, они выбрали вводящий в заблуждение / неполный термин "сортировка", который явно относится к порядку сортировки: collate определение.

      хотя это правда, что Microsoft могла бы сделать лучше при выборе имени, К сожалению, существует общая, общепромышленная путаница в отношении таких терминов, как "кодировка", "набор символов", "сопоставление" и т. д. Использование Microsoft (или неправильное использование) "сортировки" просто способствовало массовой путанице. Но эта путаница также очевидна в MySQL, как показано в этом вопросе, учитывая, что" utf8 " специально не набор символов ;-).

      UTF-8 является одним из нескольких кодировок для набора символов Unicode. UTF-16 и UTF-32 являются двумя другими кодировками. Все три эти кодировки представляют собой один и тот же набор символов Юникода, только по-разному. Глядя на список наборов символов MySQL -11.1.10 поддерживаемые наборы символов и сортировки – в "ucs2", "utf8", то "utf8mb4", "формате UTF16", "utf16le", "кодировках utf32" кодировки фактически не кодировки, как таковой, но различные представления Набор символов Юникода. Но, учитывая перекрытие между понятиями "набор символов" и "кодировка", было бы трудно не иметь этой путаницы. The 11.1.10.1 Наборы Символов Юникода страница указывает, что "utf8mb4", "формате UTF16", "utf16le", и "кодировках utf32" наборы символов полный Юникод кодировок, а "ucs2" и "utf8" являются подмножествами набор символов Unicode, в частности, первый 65,536 кодов пунктов (.к.а. Основной многоязычной плоскости (bmp)).

      дополнительные информация о сортировке по различным СУБД, пожалуйста, см. Мой ответ на следующий вопрос о DBA.Клиент StackExchange:

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


      обновление 2018-10-02

      хотя это еще не жизнеспособный вариант, SQL Server 2019 вводит встроенную поддержку UTF-8 в VARCHAR / CHAR типы данных. В настоящее время слишком много ошибок с ним для него для использования, но если они исправлены, то это опция для некоторые сценарии. Пожалуйста, посмотрите мой пост".--93-->собственная поддержка UTF-8 в SQL Server 2019: спаситель или лжепророк?", для детального анализа этой новой функции.