若要使数据库识别 Unicode,除了使用 nchar、nvarchar 和 ntext 数据类型定义 Unicode 存储外,还可以定义识别 Unicode 的客户端交互。可以通过在数据库服务器端执行下列操作来定义识别 Unicode 的客户端交互:
ASCII() 函数返回所传递字符的非 Unicode 字符代码。因此,在为非 Unicode 字符串使用 ASCII 函数的情况下为 Unicode 字符串使用等价函数 UNICODE()。对于 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;
在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N 为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。
例如,在前面示例中创建的存储过程可以按以下方式在服务器上执行:
EXECUTE Product_Info @name = N'Chain'
使用 N 前缀的要求适用于服务器上产生的字符串常量和从客户端发送的字符串常量。