在T-SQL语句中前缀N的含义是什么?什么时候应该使用它?

我在一些插入T-SQL查询中见过前缀N。许多人在将值插入表之前使用过N

我搜索了一下,但我不能理解在向表中插入任何字符串之前包含N的目的是什么。

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

这个“N”前缀有什么用途,什么时候应该使用它?

398024 次浏览

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

您可能已经看到Transact-SQL代码传递字符串使用 N前缀。这表示后续字符串是Unicode格式的 (N实际上代表国家语言字符集)。哪一个 意味着你正在传递一个NCHAR, NVARCHAR或NTEXT值,作为 相对于CHAR, VARCHAR或TEXT.

引用从微软:

Prefix包含字母n的Unicode字符串常量 N前缀时,将字符串转换为默认代码页 数据库。此默认代码页可能无法识别某些字符 . < / p >


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

varchar和nvarchar有什么区别?< / >

假设值为nvarchar类型我们只使用N "

让我告诉你一个恼人的事情发生在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没有大点İ,所以我想它失败了。

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 criteria/UPDATE/INSERT子句中指定字符串时总是使用前缀N。如果您不这样做,并且字符串中的一个字符是unicode(例如国际字符- example - ā),那么它将失败或遭受数据损坏。