Написание инструкций Transact-SQL, адаптированных к международному использованию

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure даAzure Synapse Analytics даПараллельное хранилище данных

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

  • Начиная с SQL Server 2019 (15.x) и в База данных SQL Azure следует использовать:

    • типы данных char, varchar и varchar(max) с параметрами сортировки с поддержкой символов UTF-8; данные кодируются с помощью UTF-8;
    • типы данных nchar, nvarchar и nvarchar(max) с параметрами сортировки с поддержкой дополнительных символов; данные кодируются с помощью UTF-16. Использование параметров сортировки, не поддерживающих дополнительные символы, приводит к кодированию данных с использованием UCS-2.

    Это позволяет избежать проблемы преобразования кодовых страниц. См. подробнее о различиях в хранении для символов UTF-8 и UTF-16.

  • Вплоть до SQL Server 2017 (14.x); все элементы с типами данных char, varchar и text замените элементами с типами данных nchar, nvarchar и nvarchar(max). При использовании параметров сортировки с поддержкой дополнительных символов данные кодируются с помощью UTF-16. Использование параметров сортировки, не поддерживающих дополнительные символы, приводит к кодированию данных с использованием UCS-2. Это позволяет избежать проблемы преобразования кодовых страниц. Дополнительные сведения см. в статье Collation and Unicode Support.

    Важно!

    Тип данных text является устаревшим, и его не следует использовать в новых разработках. Запланируйте преобразование данных типа text в varchar(max).

  • При выполнении сравнения и других операций со значениями месяцев и дней недели следует использовать числовые эквиваленты вместо строковых имен. При различных языковых настройках возвращаются различные названия месяцев и дней недели. Например, DATENAME(MONTH,GETDATE()) возвращает May при языковой настройке "Английский (США)", возвращает Mai для немецкого и mai — для французского. Вместо нее следует использовать функцию наподобие DATEPART, в которой вместо названия месяца используется его номер. При выводе результирующих наборов пользователю лучше использовать названия из функции DATEPART(), так как они зачастую более информативны, чем числовое представление даты. Однако не следует кодировать какую-либо логику, зависящую от отображаемых названий на том или ином языке.

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

    • В приложениях ADO, OLE DB и ODBC следует использовать принятые в ODBC форматы отметок времени, даты и времени:

      { ts' yyyy - mm - dd hh : mm : ss [ . fff] '} , например: { ts'1998-09-24 10:02:20'}

      { d' yyyy - mm - dd '}, например: { d'1998-09-24'}

      { t' hh : mm : ss '} , например: { t'10:02:20'}

    • В приложениях с использованием других прикладных программных API-интерфейсов, а также в скриптах языка Transact-SQL , хранимых процедурах и триггерах следует использовать числовые строки без разделителей. Например, yyyymmdd в виде 19980924.

    • В приложениях с использованием других программных интерфейсов API, а также в скриптах языка Transact-SQL, хранимых процедурах и триггерах следует использовать инструкцию CONVERT с явно заданным параметром стиля для всех преобразований между типами данных time, date, smalldate, datetime, datetime2 и datetimeoffset, а также строковыми типами данных. Например, следующая инструкция интерпретируется одинаково для любых настроек языка и формата даты в соединении:

      SELECT *  
      FROM AdventureWorks2012.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

См. также

Функции CAST и CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
Поддержка параметров сортировки и Юникода