以 Unicode 進行伺服器端程式設計
要讓資料庫感知 Unicode,牽涉到定義 Unicode 感知的用戶端互動,並且要使用 nchar、nvarchar 和 nvarchar(max) 資料類型來定義 Unicode 儲存體。您可以在資料庫伺服器端執行下列項目來定義 Unicode 感知的用戶端互動:
在資料表資料行和 CONVERT() 與 CAST() 作業中從非 Unicode 資料類型切換到 Unicode 資料類型。
以相對的 Unicode 函數 UNICODE() 和 NCHAR() 取代使用 ASCII() 和 CHAR() 函數。
以 Unicode 定義預存程序和觸發程序的變數和參數。
以字母 N 做為 Unicode 字元字串常數的前置詞。
使用 UNICODE()、NCHAR() 和其他函數
ASCII() 函數會對傳入的字元傳回非 Unicode 字元碼。因此,對 Unicode 字串使用對應的 UNICODE() 函數,就像對非 Unicode 字串使用 ASCII 函數。對於 CHAR 函數也是一樣;NCHAR 是其對應的 Unicode 函數。
因為 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 前置詞的要求適用於由伺服器發出以及由用戶端傳送的字串常數。