Поделиться через


Collation and Unicode Support

Параметры сортировки SQL Server предоставляют свойства, управляющие правилами сортировки, учета регистра и диакритических знаков в данных. Параметры сортировки, используемые с символьными типами данных, такими как char и varchar, определяют кодовую страницу и соответствующие символы, которые могут использоваться для этого типа данных. Независимо от того, устанавливаете ли вы новый экземпляр SQL Server, восстанавливаете резервную копию базы данных или подключаете сервер к клиентским базам данных, важно понимать требования к языковому стандарту, порядок сортировки, а также учет регистра и диакритических знаков данных, с которыми вы будете работать. Список параметров сортировки, доступных в экземпляре SQL Server, см. в разделе sys.fn_helpcollations (Transact-SQL).

При выборе параметров сортировки для сервера, базы данных, столбца или выражения, данным присваиваются определенные характеристики, которые будут влиять на многие операции в базе данных. Например, если строится запрос с предложением ORDER BY, порядок результирующего набора может зависеть от параметров сортировки, которые применяются к базе данных, или предложения COLLATE на уровне выражения запроса.

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

Параметры сортировки

Параметры сортировки задают битовые шаблоны, представляющие в наборе данных каждый символ. Параметры сортировки определяют правила, используемые при сортировке и сравнении данных. SQL Server поддерживает хранение объектов с различными параметрами сортировки в одной базе данных. Для столбцов в кодировке, отличающейся от Юникода, настройка параметров сортировки определяет кодовую страницу данных и соответствующую возможность представления символов. Данные, которые перемещаются между столбцами в форматах, отличных от Юникода, необходимо преобразовывать из исходной кодовой страницы в целевую.

Результаты инструкции Transact-SQL могут отличаться при выполнении инструкции в контексте разных баз данных с разными параметрами сортировки. По возможности используйте стандартные параметры сортировки для всей организации. Тем самым не придется явно указывать параметры сортировки для каждого символа или выражения Юникода. Если необходимо работать с объектами, имеющими различные параметры сортировки и кодовые страницы, создание запросов должно производиться с учетом очередности параметров сортировки. Дополнительные сведения см. в разделе Очередность параметров сортировки (Transact-SQL).

Параметры сортировки могут учитывать регистр, диакритические знаки, тип японской азбуки, ширину символов. Эти параметры задаются путем их добавления к имени параметров сортировки. Например, параметр Japanese_Bushu_Kakusu_100_CS_AS_KS_WS определяет параметры сортировки с учетом диакритических знаков, регистра, типа японской азбуки и ширины символов. В следующей таблице описывается режим работы, связанный с этими параметрами.

Параметр Описание
С учетом регистра (_CS) Различаются буквы верхнего и нижнего регистров. При выборе этого параметра буквы нижнего регистра при сортировке ставятся перед соответствующими буквами верхнего регистра. Если этот параметр не установлен, параметры сортировки не будут учитывать регистр. То есть при сортировке SQL Server считает буквы верхнего и нижнего регистров и делает их идентичными друг другу. Можно явно выбрать нечувствительность к регистру, указав параметр _CI.
С учетом диакритических знаков (_AS) Различаются символы с диакритическими знаками и без них. Например, "a" отлично от "ấ". Если этот параметр не установлен, параметры сортировки не будут учитывать диакритические знаки. То есть при сортировке SQL Server рассматривает варианты букв с диакритическими знаками и без них как идентичные. Можно явно выбрать нечувствительность к диакритическим знакам, указав параметр _АI.
С учетом типа японской азбуки (_KS) Различаются два вида японской азбуки: хирагана и катакана. Если данный параметр не выбран, параметр сортировки не чувствителен к типу японской азбуки. То есть при сортировке SQL Server рассматривает символы хирагана и катакана как идентичные. Пропуск этого параметра является единственным способом указания нечувствительности к типу японской азбуки.
С учетом ширины символов (_WS) Отличия между символами полной ширины и средней ширины. Если данный параметр не выбран, SQL Server принимает отображение одного и того же символа полной ширины и средней ширины для целей сортировки как идентичное. Пропуск этого параметра является единственным способом указания нечувствительности к ширине символов.

SQL Server поддерживает следующие наборы параметров сортировки:

параметры сортировки Windows
Параметры сортировки Windows определяют правила хранения символьных данных на основе соответствующей локали системы Windows. Для параметров сортировки Windows сравнение данных в формате, отличном от Юникода, реализовано с помощью такого же алгоритма, как и для данных в Юникоде. Базовые правила параметров сортировки Windows задают алфавит или язык, используемый при сортировке по словарю, а также кодовую страницу, используемую для хранения символьных данных не в Юникоде. Сортировка в Юникоде и в других форматах совместима со строковым сравнением в соответствующей версии Windows. Это обеспечивает согласованность между типами данных в SQL Server, а также позволяет разработчикам сортировать строки в своих приложениях, используя те же правила, которые используются SQL Server. Дополнительные сведения см. в статье Имя параметров сортировки Windows (Transact-SQL).

Двоичные параметры сортировки
При двоичных параметрах сортировки данные сортируются на основе последовательности закодированных значений, определяемых локалью и типом данных. Регистр при этом учитывается. Двоичные параметры сортировки в SQL Server определяют языковой стандарт и кодовую страницу ANSI, которые будут использоваться. При этом принудительно реализуется двоичный порядок сортировки. По причине своей относительной простоты параметры двоичной сортировки помогают повысить производительность приложений. Для типов данных не в Юникоде сравнение данных производится на основе кодовых точек, определенных кодовой страницей ANSI. Типы данных в Юникоде сравниваются на основе элементов кода Юникода. Для двоичных параметров сортировки на основе типов данных Юникода при сортировке данных локаль не учитывается. Например, параметры сортировки Latin_1_General_BIN и Japanese_BIN дают одинаковые результаты сортировки, если используются с данными в Юникоде.

В SQL Server есть два типа двоичных параметров сортировки: старые BIN и новыеBIN2. В сортировке BIN2 все символы сортируются в соответствии с их кодовыми точками. В сортировке BIN только первый символ сортируется в соответствии с кодовой точкой, остальные символы сортируются в соответствии с их значениями байта. (Так как платформа Intel не всегда является архитектурой по порядку следования байтов, символы кода Unicode всегда хранятся с перестановкой байт).

параметры сортировки SQL Server
SQL Server параметры сортировки (SQL_*) обеспечивают совместимость порядка сортировки с более ранними версиями SQL Server. Правила сортировки словаря для данных в формате, отличном от Юникода, не совместимы ни с какими процедурами сортировки операционных систем Windows. Однако сортировка данных в Юникоде совместима с правилами сортировки определенной версии Windows. Так как SQL Server параметры сортировки используют разные правила сравнения для данных, отличных от Юникода и Юникода, вы увидите разные результаты для сравнения одних и тем же данных в зависимости от базового типа данных. Дополнительные сведения см. в статье Имя параметров сортировки SQL Server (Transact-SQL).

Примечание

При обновлении англоязычного экземпляра SQL Server можно указать параметры сортировки SQL Server (SQL_*) для обеспечения совместимости с существующими экземплярами SQL Server. Так как параметры сортировки по умолчанию для экземпляра SQL Server определяются во время установки, убедитесь, что параметры сортировки указаны тщательно, если выполняются следующие условия:

  • Код приложения зависит от поведения предыдущих параметров сортировки SQL Server .
  • Необходимо хранить символьные данные, в которых используется несколько языков.

Настройка параметров сортировки поддерживается на следующих уровнях экземпляра SQL Server.

Параметры сортировки уровня сервера
Параметры сортировки сервера по умолчанию задаются во время установки SQL Server, а также становятся параметрами сортировки по умолчанию для системных баз данных и всех пользовательских баз данных. Обратите внимание, что параметры сортировки только в Юникоде нельзя выбрать во время настройки SQL Server, так как они не поддерживаются в качестве параметров сортировки на уровне сервера.

После назначения параметров сортировки серверу, изменить параметры можно будет только с помощью экспорта объектов базы данных, перестроения базы данных master и импорта всех объектов и данных базы данных. Вместо изменения параметров сортировки по умолчанию для экземпляра SQL Server можно указать нужные параметры сортировки во время создания новой базы данных или столбца базы данных.

Параметры сортировки уровня базы данных
При создании или изменении базы данных можно задать параметры ее сортировки по умолчанию с помощью предложения COLLATE в инструкции CREATE DATABASE или ALTER DATABASE. Если параметры сортировки не указаны, базе данных назначаются параметры сортировки сервера.

Невозможно изменить параметры сортировки системных баз данных с помощью изменения параметров сортировки сервера.

Параметры сортировки базы данных используются для всех метаданных в базе данных, а также по умолчанию для всех строковых столбцов, временных объектов, имен переменных и любых других строковых объектов в базе данных. Когда вы изменяете сортировку базы данных пользователя, могут возникнуть конфликты сортировки, кода запросы в базе данных получают доступ к временным таблицам. Временные таблицы всегда хранятся в системной базе данных tempdb, которая использует параметры сортировки экземпляра. Запросы, сравнивающие символьные данные в пользовательской базе данных и tempdb, могут завершиться ошибкой, если параметры сортировки вызовут конфликт при оценке таких данных. Можно решить эту проблему, указав в запросе предложение COLLATE. Дополнительные сведения см. в статье COLLATE (Transact-SQL).

Параметры сортировки уровня столбцов
При создании или изменении таблицы можно указать параметры сортировки для каждого столбца символьной строки с помощью предложения COLLATE. Если параметры сортировки не указаны, то столбцу присваиваются параметры сортировки по умолчанию для базы данных.

Параметры сортировки уровня выражений
Параметры сортировки уровня выражения задаются при выполнении инструкции, и они влияют на способ возврата результирующего набора. Это позволяет определить результаты сортировки предложения ORDER BY в соответствии с конкретным языковым стандартом. Для реализации параметров сортировки уровня выражения предложение COLLATE применяется следующим образом.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;  

Локаль

Локаль представляет собой набор сведений, связанных с местоположением или с культурой. В нее может входить имя и идентификатор языка, скрипт, применяемый для записи на нем, а также национальные стандарты. Параметры сортировки могут быть ассоциированы с одним или несколькими локалями. Дополнительные сведения см. в разделе Номера локалей, назначаемые Microsoft.

Кодовая страница

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

Порядок сортировки

Порядок сортировки устанавливает способ сортировки значений данных. Это влияет на результаты сравнения данных. Данные сортируются с помощью параметров сортировки, и ее можно оптимизировать с помощью индексов.

Поддержка Юникода

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

Типы данных, отличные от Юникода, имеют значительные ограничения. Это происходит, поскольку на компьютере, где не применяется Юникод, можно использовать только одну кодовую страницу. Применение Юникода позволяет повысить производительность, поскольку требуется выполнять меньше преобразований кодовых страниц. Параметры сортировки в Юникоде следует выбирать индивидуально на уровне базы данных, столбца или выражения, поскольку они не поддерживаются на уровне сервера.

Кодовая страница, используемая клиентом, определяется параметрами операционной системы. Чтобы установить кодовую страницу клиента в операционной системе Windows, используйте раздел Язык и региональные стандарты на панели управления.

При переносе данных из сервера на клиент старые клиентские драйверы могут не распознать параметры сортировки сервера. Это может произойти при передаче данных с сервера с поддержкой Юникода на клиент без поддержки Юникода. Лучшим вариантом может быть обновление операционной системы клиента, чтобы обновить параметры сортировки базовой системы. Если на клиенте установлена клиентская программа базы данных, можно попробовать применить обновление службы к клиентской программе базы данных.

Можно также попробовать использовать другие параметры сортировки для данных на сервере. Выберите параметры сортировки, соответствующие кодовой странице на клиенте.

Чтобы использовать параметры сортировки UTF-16, доступные в SQL Server 2019 (15.x), можно выбрать один из дополнительных параметров сортировки символов _SC (только параметры сортировки Windows), чтобы улучшить поиск и сортировку некоторых символов Юникода.

Чтобы получить представление о трудностях, связанных с применением типов данных в Юникоде или не в Юникоде, протестируйте свой сценарий, измерив разницу производительности для этих двух вариантов в вашей среде. Рекомендуется стандартизировать системные параметры сортировки, которые используются в организации, а там, где это возможно, — развертывать серверы и клиенты с поддержкой Юникода.

Во многих ситуациях SQL Server будет взаимодействовать с другими серверами или клиентами, и ваша организация может использовать несколько стандартов доступа к данным между приложениями и экземплярами сервера. КлиентыSQL Server могут быть двух видов:

  • Клиенты с поддержкой Юникода , применяющие OLE DB и ODBC версии 3.7 или более поздних версий.

  • Клиенты без поддержки Юникода , применяющие библиотеку баз данных и ODBC версий 3.6 или более ранних версий.

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

Сервер клиент Преимущества или ограничения
Юникод Юникод Поскольку данные в Юникоде широко используются в системе, этот сценарий обеспечивает наилучшую производительность и защиту полученных данных от повреждения. Это случай применения ActiveX (ADO), OLE DB, а также ODBC версий 3.7 или более поздних версий.
Юникод Не Юникод В этом сценарии, особенно при подключении между сервером под управлением более новой операционной системы и клиентом под управлением более старой версии SQL Server или в более старой операционной системе, при перемещении данных на клиентский компьютер могут возникать ограничения или ошибки. Будет предпринята попытка преобразовать находящиеся на сервере данные в Юникоде с помощью соответствующей кодовой страницы на клиенте, кодировка которого отлична от Юникода.
Не Юникод Юникод Это не лучшая конфигурация для работы с данными на нескольких языках. Невозможно записать данные в Юникоде на сервер, работающий не в Юникоде. Вероятнее всего, неполадки могут произойти при отправке данных на серверы, которые поддерживают другие кодовые страницы.
Не Юникод Не Юникод В этом сценарии очень много ограничений для применения данных на нескольких языках. Можно использовать только одну кодовую страницу.

Дополнительные символы

SQL Server предоставляет типы данных, такие как nchar и nvarchar , для хранения данных Юникода. Эти типы данных кодируют текст в формате UTF-16. Консорциум Юникода назначает каждому символу уникальную кодовую точку, лежащую в диапазоне от 0x0000 до 0x10FFFF. Наиболее часто используемые символы имеют значения кодовых точек, умещающиеся в 16-разрядное слово в памяти и на диске, однако символы с кодовыми точками более 0xFFFF требуют для хранения два 16-разрядных слова. Они называются дополнительными символами, а два последовательных 16-разрядных слова — суррогатной парой.

Если используются дополнительные символы:

  • Дополнительные символы могут применяться в операциях сортировки и сравнения только в параметрах сортировки с версией 90 или выше.

  • Все новые параметры сортировки уровня 100 поддерживают лингвистическую сортировку с обработкой дополнительных символов.

  • Дополнительные символы не поддерживаются в метаданных (например, в именах объектов баз данных).

  • Появилось в SQL Server 2012 г., новое семейство параметров сортировки дополнительных символов (SC) можно использовать с типами ncharданных , nvarchar и sql_variant. Например: Latin1_General_100_CI_AS_SCили (при использовании параметров сортировки для японского языка) Japanese_Bushu_Kakusu_100_CI_AS_SC.

    Флаг SC может применяться к следующим параметрам сортировки:

    • Параметры сортировки Windows версии 90

    • Параметры сортировки Windows версии 100

    Флаг SC не может применяться к следующим параметрам сортировки:

    • Параметры сортировки Windows версии 80 и ниже

    • Параметры двоичной сортировки BIN и BIN2

    • Параметры сортировки SQL*

В следующей таблице сравниваются поведение некоторых строковых функций и строковых операторов при использовании дополнительных символов с параметрами сортировки SC и без них.

Строковая функция или оператор С параметрами сортировки SC Без параметров сортировки SC
CHARINDEX

LEN

PATINDEX
Суррогатные пары UTF-16 считаются одной кодовой точкой. Суррогатные пары UTF-16 считаются двумя кодовыми точками.
LEFT

REPLACE

REVERSE

RIGHT

SUBSTRING

STUFF
Эти функции обрабатывают каждую суррогатную пару как одну кодовую точку и работают ожидаемым образом. Эти функции могут разорвать любые суррогатные пары, что может привести к непредвиденным результатам.
NCHAR Возвращает символ, соответствующий заданному значению кодовой точки в Юникоде в диапазоне от 0 до 0x10FFFF. Если указанное значение лежит в диапазоне от 0 до 0xFFFF, то возвращается один символ. Для больших значений возвращается соответствующая суррогатная пара. Если значение превышает 0xFFFF, то вместо соответствующей суррогатной пары возвращается значение NULL.
UNICODE Возвращает кодовую точку UTF-16 в диапазоне от 0 до 0x10FFFF. Возвращает кодовую точку UCS-2 в диапазоне от 0 до 0xFFFF.
Шаблон — совпадение одного символа

Шаблон — несовпадающие символы
Дополнительные символы поддерживаются для всех операций с символами-шаблонами. Дополнительные символы не поддерживаются для этих операций с символами-шаблонами. Поддерживаются другие операторы символов-шаблонов.

Поддержка GB18030

GB18030 — это отдельный стандарт, который применяется в Китайской Народной Республике для кодирования китайских иероглифов. В кодировке GB18030 введенные данные могут иметь длину 1, 2 или 4 байт. SQL Server предоставляет поддержку символов GB18030, распознает их при вводе из клиентского приложения, преобразуя и сохраняя в виде символов Юникода. После сохранения на сервере эти символы при выполнении всех последующих операций рассматриваются как символы Юникода. Можно использовать любые параметры сортировки для китайского языка. Желательно использовать последнюю версию (100). Все параметры сортировки уровня 100 поддерживают лингвистическую сортировку при использовании символов GB18030. Если данные содержат дополнительные символы (суррогатные пары), можно использовать параметры сортировки SC, доступные в SQL Server 2019 (15.x), для улучшения поиска и сортировки.

Поддержка сложных скриптов

SQL Server поддерживает ввод, хранение, изменение и отображение наборов сложных скриптов. Ниже приведены виды сложных скриптов:

  • Скрипты с языками с различным направлением письма, например сочетание английского и арабского текстов.

  • Скрипты, в которых форма символов изменяется в зависимости от их положения или где сочетаются разные символы (например, в арабском, хинди, тайском).

  • Для таких языков как тайский требуются внутренние словари для распознавания слов, поскольку между словами нет пробелов.

Приложения баз данных, взаимодействующие с SQL Server , должны применять управляющие элементы, которые поддерживают сложные скрипты. Стандартные средства управления формами Windows, которые создаются в управляемом коде, поддерживают сложные сценарии.

Задача Раздел
Описание задания или изменения параметров сортировки экземпляра SQL Server. Задание или изменение параметров сортировки сервера
Описание задания или изменения параметров сортировки пользовательской базы данных. Установка и изменение параметров сортировки базы данных
Описание задания или изменения параметров сортировки столбца в базе данных. Задание или изменение параметров сортировки столбца
Описание способа возврата сведений о параметрах сортировки на уровне сервера, базы данных или столбца. Просмотр сведений о параметрах сортировки
Описание способа написания инструкций Transact-SQL, в которых можно более просто обеспечить большую степень языковой переносимости или поддержку нескольких языков. Написание инструкций Transact-SQL, адаптированных к международному использованию
Описание способа изменения языка сообщений об ошибках и параметров отображения времени и валюты. Задание языка сеанса

Рекомендованные изменения параметров сортировки SQL Server

Рекомендации по миграции SQL Server на Юникод

Веб-сайт консорциума Юникод

См. также:

Параметры сортировки автономной базы данных
Выбор языка при создании полнотекстового индекса
sys.fn_helpcollations (Transact-SQL)