Программирование на сервере с использованием Юникода

Изменения: 17 июля 2006 г.

Чтобы база данных правильно работала с кодировкой Юникод, помимо использования типов данных nchar, nvarchar и nvarchar(max) для определения хранилища данных в кодировке Юникод, необходимо определить взаимодействие с клиентом, работающим с кодировкой Юникод. Взаимодействие с клиентом в рамках кодировки Юникод можно определить, выполнив на сервере базы данных следующие действия.

  • Переключитесь с типов данных, не поддерживающих Юникод, на типы, поддерживающие его, в столбцах таблицы и в операциях CONVERT() и CAST().
  • Замените используемые функции ASCII() и CHAR() на их эквиваленты, поддерживающие Юникод, UNICODE() и NCHAR().
  • Определите переменные и параметры хранимых процедур и триггеров в кодировке Юникод.
  • Установите префикс символьных строковых констант в кодировке Юникод в виде буквы N.

Использование UNICODE(), NCHAR() и других функций

Функция ASCII() возвращает код введенного символа в таблице ASCII. Поэтому следует использовать аналогичную функцию UNICODE() для строк Юникода там же, где использовалась бы функция ASCII() для строк не в Юникоде. То же самое справедливо для функции CHAR(); ее аналогом в Юникоде является NCHAR().

Так как функция SOUNDEX() определяется на основе английских фонетических правил, для строк в Юникоде это роли не играет, если они содержат только символы латиницы от A до Z и от a до z.

Функции ASCII(), CHAR() и SOUNDEX() могут использоваться с параметрами в Юникоде, но эти аргументы будут неявно преобразовываться к строкам других кодовых страниц. Это может привести к возможным потерям символов Юникода перед обработкой, так как данные функции по определению работают со строками кодовых страниц, отличных от Юникода.

Кроме функций UNICODE() и NCHAR(), следующие строковые функции поддерживают Юникод там, где это возможно: CHARINDEX(), LEFT(), LEN(), UPPER(), LOWER(), LTRIM(), RTRIM(), PATINDEX(), REPLACE(), QUOTENAME(), REPLICATE(), REVERSE(), STUFF(), SUBSTRING(), UNICODE(). Эти функции принимают аргументы в Юникоде, используют для каждого символа строк Юникода по два байта, и применяют правила сортировки Юникода для операций сравнения строк, когда входные параметры находятся в формате Юникод.

Определение параметров хранимых процедур

Определение параметров в типе данных Юникод гарантирует, что запросы клиента или входные данные будут неявно преобразованы на сервере в Юникод и не будут повреждены при обработке. Если параметр определен как параметр OUTPUT, то тип данных Юникода минимизирует вероятность повреждения параметра на его обратном пути к клиенту.

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

CREATE PROCEDURE Product_Info
    @name nvarchar(40)
AS
SELECT p.ListPrice, v.Name
    FROM Production.Product p 
        INNER JOIN Purchasing.ProductVendor pv
            ON p.ProductID = pv.ProductID  
        INNER JOIN Purchasing.Vendor v
            ON pv.VendorID = v.VendorID
WHERE p.Name = @name;

Использование префикса N

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

Например, созданная в прошлом примере хранимая процедура может выполниться на сервере следующим образом:

EXECUTE Product_Info @name = N'Chain'

Префикс N необходимо использовать и в созданных на сервере строковых константах, и в строковых константах, отправляемых с клиента.

См. также

Основные понятия

Программирование на стороне клиента с использованием Юникода

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

17 июля 2006 г.

Измененное содержимое
  • Заменены ссылки на тип данных ntext ссылками на тип данных nvarchar(max).