T-SQL语句中前缀N的含义是什么?

Kar*_*tel 325 sql t-sql sql-server

我在一些插入T-SQL查询中看到了前缀N. 许多人N在将值插入表中之前已经使用过.

我搜索过,但是我无法理解N在将任何字符串插入表格之前包括之前的目的是什么.

 INSERT INTO Personnel.Employees
 VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),
Run Code Online (Sandbox Code Playgroud)

Cur*_*urt 392

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

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

引用微软的话:

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


如果您想知道这两种数据类型之间的区别,请参阅此SO帖子:

varchar和nvarchar有什么区别?

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

bh_*_*th0 18

让我告诉你N'前缀发生了什么令人讨厌的事情.而且我无法修复2天.

我的db排序规则SQL_Latin1_General_CP1_CI_AS.

这里有张桌子.列 MyCol1Nvarchar

但是此查询无法匹配存在的精确值.

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

// 0 result
Run Code Online (Sandbox Code Playgroud)

使用前缀N''修复它

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

// 1 result - found!!!!
Run Code Online (Sandbox Code Playgroud)

为什么?因为latin1_general没有大的点缀,这就是为什么它失败我想.


var*_*ble 7

1.性能:

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

WHERE NAME='JON'
Run Code Online (Sandbox Code Playgroud)

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

2.字符集:

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