ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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


J
John Cummings

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

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

引用 from Microsoft

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

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

What is the difference between varchar and nvarchar?


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

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


v
variable

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


R
RickyRam

假设值是 nvarchar 类型,因为只有我们使用 N''