T-SQL语句中的前缀N是什么意思,什么时候应该使用它?


352

我在某些插入T-SQL查询中看到前缀N。N在表中插入值之前,许多人已经使用过。

我进行了搜索,但是N在将任何字符串插入表中之前无法理解包括的目的是什么。

INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),

此“ N”前缀起什么作用?何时使用?

Answers:


415

它声明字符串为nvarchar数据类型,而不是数据类型varchar

您可能已经看到了Transact-SQL代码,该代码使用N前缀传递字符串。这表示后续的字符串采用Unicode(N实际上代表本国语言字符集)。这意味着您正在传递一个NCHAR,NVARCHAR或NTEXT值,而不是CHAR,VARCHAR或TEXT。

引用微软的话

使用字母N作为前缀Unicode字符串常量。不带N前缀的字符串将转换为数据库的默认代码页。此默认代码页可能无法识别某些字符


如果您想知道这两种数据类型之间的区别,请参阅以下SO文章:

varchar和nvarchar有什么区别?


1
@Curt意味着我N仅在使用以下数据类型时才应使用CHAR, VARCHAR or TEXT?因为`NCHAR,NVARCHAR或NTEXT`本质上是存储UNICODE的,所以我不需要单独添加它....这是真的吗?
Pritesh 2012年

@Pritesh-仅当您使用默认代码页时,如上面的粗体文本所示,该代码页可能无法识别那些unicode字符。
Todd

5
@Curt的链接databases aspfaq com重定向到极其可疑的网站(fkref comza1 zeroredirect1 comi0z13 trackvoluum com),它的特点是我们的企业防火墙色情,恶意网站和垃圾邮件的URL。我已经联系了aspfaq.com所有者,并编辑了答案以删除链接。
Jaume 2015年

21

让我告诉您N'前缀出现的一件令人讨厌的事情-我两天都无法修复它。

我的数据库排序规则SQL_Latin1_General_CP1_CI_AS

它具有一个名为MyCol1的表。这是一个Nvarchar

该查询无法匹配存在的精确值。

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = 'ESKİ'  

// 0 result

使用前缀N''修复它

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = N'ESKİ'  

// 1 result - found!!!!

为什么?因为latin1_general没有大的点缀İ,所以我认为这就是失败的原因。


8

1.性能:

假设您的where子句是这样的:

WHERE NAME='JON'

如果NAME列的类型不是nvarchar或nchar,则不应指定N前缀。但是,如果NAME列的类型为nvarchar或nchar,则如果未指定N前缀,则'JON'被视为非Unicode。这意味着NAME列和字符串'JON'的数据类型不同,因此SQL Server将一个操作数的类型隐式转换为另一种。如果SQL Server将文字的类型转换为列的类型,则没有问题,但是如果以其他方式进行转换,则性能将受到损害,因为将不使用列的索引(如果可用)。

2.字符集:

如果列的类型为nvarchar或nchar,则在WHERE条件/ UPDATE / INSERT子句中指定字符串时,请始终使用前缀N。如果不这样做,则字符串中的一个字符是unicode(例如国际字符-例如-ā),则它将失败或遭受数据损坏。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.