我在一些插入 T-SQL 查询中看到了前缀 N。许多人N
在向表中插入值之前使用过。
我进行了搜索,但我无法理解N
在将任何字符串插入表之前包含的目的是什么。
INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),
这个“N”前缀有什么作用,应该在什么时候使用?
我在一些插入 T-SQL 查询中看到了前缀 N。许多人N
在向表中插入值之前使用过。
我进行了搜索,但我无法理解N
在将任何字符串插入表之前包含的目的是什么。
INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),
这个“N”前缀有什么作用,应该在什么时候使用?
它将字符串声明为nvarchar
数据类型,而不是varchar
您可能已经看到使用 N 前缀传递字符串的 Transact-SQL 代码。这表示随后的字符串是 Unicode(N 实际上代表国家语言字符集)。这意味着您传递的是 NCHAR、NVARCHAR 或 NTEXT 值,而不是 CHAR、VARCHAR 或 TEXT。
引用微软的话:
使用字母 N 为 Unicode 字符串常量添加前缀。如果没有 N 前缀,则字符串将转换为数据库的默认代码页。此默认代码页可能无法识别某些字符。
如果您想知道这两种数据类型之间的区别,请参阅此 SO 帖子:
让我告诉你前缀发生的一件烦人的事情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 条件/UPDATE/INSERT 子句中指定字符串时始终使用前缀 N。如果您不这样做并且字符串中的字符之一是 unicode(如国际字符 - 示例 - ā),那么它将失败或遭受数据损坏。
假设值是 nvarchar 类型,因为只有我们使用 N''