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

时间:2012-04-05 08:19:54

标签: sql sql-server tsql

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

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

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

4 个答案:

答案 0 :(得分:367)

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

  

您可能已经看过使用传递字符串的Transact-SQL代码   一个N前缀。这表示后续字符串是Unicode   (N实际上代表国家语言字符集)。哪一个   表示您传递的是NCHAR,NVARCHAR或NTEXT值   反对CHAR,VARCHAR或TEXT。

引用from Microsoft

  

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


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

What is the difference between varchar and nvarchar?

答案 1 :(得分:12)

让我告诉你一个令人烦恼的事情发生在N'前缀 - 我无法修复它两天。

我的数据库归类是 SQL_Latin1_General_CP1_CI_AS

它有一个表格,其中包含一个名为 MyCol1 的列。这是 Nvarchar

此查询无法与Exact 存在的值匹配。

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没有大点缀这就是为什么它失败了我想。

答案 2 :(得分:4)

假设该值为nvarchar类型,我们只使用N'

答案 3 :(得分:2)

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