Программирование на стороне сервера с использованием Юникода
Чтобы база данных правильно работала с кодировкой Юникод, помимо использования типов данных nchar, nvarchar и nvarchar(max) для определения хранилища данных в кодировке Юникод, необходимо определить взаимодействие с клиентом, работающим с кодировкой Юникод. Взаимодействие с клиентом в рамках кодировки Юникод можно определить, выполнив на сервере базы данных следующие действия.
Переключитесь с типов данных, не поддерживающих Юникод, на типы, поддерживающие его, в столбцах таблицы и в операциях CONVERT() и CAST().
Замените используемые функции ASCII() и CHAR() на их эквиваленты, поддерживающие Юникод, UNICODE() и NCHAR().
Определите переменные и параметры хранимых процедур и триггеров в кодировке Юникод.
Установите префикс символьных строковых констант в кодировке Юникод в виде буквы N.
Использование UNICODE(), NCHAR() и других функций
Функция 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 необходимо использовать и в созданных на сервере строковых константах, и в строковых константах, отправляемых с клиента.