我在某些插入T-SQL查询中看到前缀N。

我搜索过很多人,但在将任何字符串插入表中之前将N包括在内的目的是什么。

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


此'N'前缀起什么作用,何时使用?

#1 楼

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


您可能已经看到Transact-SQL代码使用N前缀来传递字符串。这表示后面的字符串使用Unicode
(N实际上代表本国语言字符集)。
表示您正在传递NCHAR,NVARCHAR或NTEXT值,作为与CHAR,VARCHAR或TEXT相对的



Microsoft引用:


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



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

varchar和nvarchar有什么区别?

评论


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

– Pritesh
2012年8月4日,11:23

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

–托德
2015年9月1日于12:32

@Curt指向数据库aspfaq com的链接重定向到非常可疑的网站(fkref com,za1 zeroredirect1 com,i0z13 trackvoluum com),这些网站已被我们的公司防火墙标记为色情,恶意站点和垃圾邮件URL。我已联系aspfaq.com所有者并编辑了答案以删除链接。

– Jaume
15年11月26日在8:17



#2 楼

让我告诉您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没有大的点缀İ,所以我认为这就是失败的原因。

#3 楼

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(例如国际字符-例如-ā),则它将失败或遭受数据损坏。

#4 楼

假设值是nvarchar类型,那是因为我们只使用N''