T-SQL 语句中的前缀 N 是啥意思,啥时候应该使用它?

Posted

技术标签:

【中文标题】T-SQL 语句中的前缀 N 是啥意思,啥时候应该使用它?【英文标题】:What is the meaning of the prefix N in T-SQL statements and when should I use it?T-SQL 语句中的前缀 N 是什么意思,什么时候应该使用它? 【发布时间】:2012-04-18 23:34:31 【问题描述】:

我在一些插入 T-SQL 查询中看到了前缀 N。许多人在向表中插入值之前使用过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 相对。

引用from Microsoft:

在 Unicode 字符串常量前加上字母 N。不带 N前缀,字符串被转换为默认的代码页 数据库。 此默认代码页可能无法识别某些字符


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

What is the difference between varchar and nvarchar?

【讨论】:

@Curt 这意味着我应该使用N 仅当我使用以下数据类型CHAR, VARCHAR or TEXT??因为 ` NCHAR、NVARCHAR 或 NTEXT ` 本质上是存储 UNICODE 我不需要单独添加它......真的吗? @Pritesh - 仅当您使用可能无法识别上述粗体文本中的那些 unicode 字符的默认代码页时。 @Curt 指向databases aspfaq com 的链接会重定向到极其可疑的网站(fkref comza1 zeroredirect1 comi0z13 trackvoluum com),这些网站已被我们的公司防火墙标记为色情、恶意网站和垃圾邮件网址。我已经联系了 aspfaq.com 所有者并编辑了答案以删除链接。 我知道这是来自 MS,但“N 是 Unicode”似乎没有细微差别。 Also MS:考虑一个定义为 NVARCHAR(100) 的列,它存储 180 个字节的日文字符……列数据使用 UCS-2 或 UTF-16 编码;每个字符 2 个字节。将列转换为 VARCHAR(200) [不会] 防止数据截断,[因为] 日文字符在 UTF-8 中需要 3 个字节。该列必须定义为 VARCHAR(270) 以避免因数据截断而丢失数据。(大量编辑)【参考方案2】:

让我告诉你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 没有 big dotted İ,所以我想这就是它失败的原因。

【讨论】:

【参考方案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''

【讨论】:

以上是关于T-SQL 语句中的前缀 N 是啥意思,啥时候应该使用它?的主要内容,如果未能解决你的问题,请参考以下文章

sqlgo是啥意思,如何使用?

SQL语句中的t.是啥意思,例如 select *from cityinfo t where t

SceneKit 中的“simd”前缀是啥意思?

cookie 域中的点前缀是啥意思?

C#using()是啥意思

macOS pluginkit 输出中的前缀是啥意思?