Unicode を使用したサーバー側のプログラミング

データベースを Unicode 対応にするには、Unicode 対応クライアントとやり取りする方法を定義する必要があります。さらに、Unicode ストレージを定義するために、nchar、nvarchar、および nvarchar(max) の各データ型を使用する必要があります。データベース サーバー側で次の作業を行うことで、Unicode 対応クライアントとやり取りする方法を定義できます。

  • テーブル列および CONVERT() 操作と CAST() 操作で、Unicode 以外のデータ型から Unicode データ型に切り替えます。

  • ASCII() 関数と CHAR() 関数を、Unicode に対応する UNICODE() 関数と NCHAR() 関数に置き換えます。

  • ストアド プロシージャやトリガの変数とパラメータを Unicode で定義します。

  • Unicode 文字列定数に、プレフィックスとして文字 N を付けます。

UNICODE()、NCHAR()、およびその他の関数の使用

ASCII() 関数では、渡された文字が Unicode 以外の文字コードで返されます。そのため、Unicode 以外の文字列に ASCII() 関数を使用する個所では、同等の機能で Unicode 文字列に対応する UNICODE() 関数を使用します。これは CHAR 関数にも当てはまります。Unicode に対応する同等の関数は NCHAR です。

SOUNDEX() 関数は英語の音声規則に基づいて定義されているので、文字列に A ~ Z および a ~ z のラテン文字だけが含まれている場合を除き、Unicode 文字列では意味がありません。

ASCII、CHAR、および SOUNDEX に Unicode パラメータを渡すことはできますが、これらの引数は Unicode 以外の文字列に暗黙的に変換されます。定義上これらの関数は Unicode 以外の文字列で動作するので、これによって処理前に Unicode 文字が失われる可能性があります。

UNICODE() 関数と NCHAR() 関数以外に、次の文字列操作関数では Unicode が可能な限りサポートされます。CHARINDEX()、LEFT()、LEN()、UPPER()、LOWER()、LTRIM()、RTRIM()、PATINDEX()、REPLACE()、QUOTENAME()、REPLICATE()、REVERSE()、STUFF()、SUBSTRING()、UNICODE()。これらの関数は Unicode 引数を受け取り、Unicode 文字列の 2 バイト文字境界を意識した処理が行われます。入力パラメータが Unicode の場合は文字列を比較する際に Unicode の並べ替え規則を使用します。

ストアド プロシージャでのパラメータの定義

Unicode データ型を使用してパラメータを定義すると、クライアントからの要求や入力がサーバーで暗黙的に Unicode に変換され、処理中に壊れることはありません。パラメータを OUTPUT パラメータとして指定すると、データがクライアントに返される際に、Unicode 型によってデータが壊れる可能性が最小限に抑えられます。

次のストアド プロシージャでは、Unicode データ型として変数が宣言されます。

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 プレフィックスの使用

ストアド プロシージャ内やトリガ内など、サーバーで実行されるコード中の Unicode 文字列定数には、定数の前に大文字の N を付ける必要があります。これは、参照される列が既に Unicode として定義されている場合にも当てはまります。N プレフィックスを付けないと、文字列はデータベースの既定のコード ページに変換されます。このとき、特定の文字は認識されないことがあります。

たとえば、前述の例で作成したストアド プロシージャは、サーバー上で次のように実行できます。

EXECUTE Product_Info @name = N'Chain'

N プレフィックスを使用するという要件は、サーバー上の文字列定数とクライアントから送信される文字列定数の両方に適用されます。