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 com
、za1 zeroredirect1 com
、i0z13 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 是啥意思,啥时候应该使用它?的主要内容,如果未能解决你的问题,请参考以下文章