SQL Server查询:字符串前面的'N'是什么意思?

时间:2011-06-17 02:01:00

标签: sql sql-server

在SQL Server中,查询

SELECT custid, country, region, city
FROM Sales.Customers
WHERE region = N'WA'

where子句中'N'的含义是什么?我删除它,得到相同的结果。

3 个答案:

答案 0 :(得分:8)

它将您的文字转换为Unicode字符串。

有关官方解释,请参阅here

  

Unicode字符串的格式类似于字符串,但前面有一个N标识符(N代表SQL-92标准中的国家语言)。

在许多情况下,除非您的文字包含Unicode字符,否则它不会有所作为。如果确实如此,并且省略了显式转换,它会将您的Unicode字符转换为'?':

select 'Ộ', N'Ộ'

---- ----
?    Ộ

答案 1 :(得分:1)

出现在服务器上执行的代码中的Unicode字符串常量(例如存储过程和触发器)必须以大写字母N开头。即使被引用的列已经定义为Unicode,也是如此。如果没有N前缀,则字符串将转换为数据库的默认代码页。这可能无法识别某些字符。

例如,可以通过以下方式在服务器上执行上一个示例中创建的存储过程:

EXECUTE Product_Info @name = N'Chain'

使用N前缀的要求适用于源自服务器的字符串常量和来自客户端的字符串常量。

答案 2 :(得分:0)

'N'代表国家语言,表示您传递的值为 NVARCHAR NCHAR 。接受英语以外语言的数据类型以N开头。

请注意,对于 VARCHAR CHAR 等数据类型,您不需要使用'N'包装参数,因为他们不喜欢不接受Unicode字符。

任何其他语言(例如阿拉伯语,波斯语)都将被视为Unicode,因此应在 NVARCHAR 等数据类型中操作它们,并且值应使用'N'包装为下面:

DECLARE @Name AS NVARCHAR(50);
SET @Name = N'اسم';
PRINT @Name;

这将返回:

اسم

如果您尝试不使用'N':

DECLARE @Name AS NVARCHAR(50);
SET @Name = 'اسم';
PRINT @Name;

这将返回

???

这是因为您没有用“N”包装值,尽管数据类型是NVARCHAR,系统对“اسم”这个词一无所知。