Sql 在脚本中把N放在字符串前面是否有缺点?它被认为是一个“问题”吗;最佳实践“;?

Sql 在脚本中把N放在字符串前面是否有缺点?它被认为是一个“问题”吗;最佳实践“;?,sql,sql-server,unicode,Sql,Sql Server,Unicode,假设我有一个表,它有一个varchar字段。如果我这样插入: INSERT MyTable SELECT N'the string goes here' 这两者之间有什么根本区别吗 INSERT MyTable SELECT 'the string goes here' 我的理解是,只有当字符串包含Unicode字符且目标列不是Unicode时,才会出现问题。除此之外,SQL很好地处理了它,并将带有N'的字符串转换为varchar字段(基本上忽略N) 我觉得在字符串前面写代码< n>

假设我有一个表,它有一个varchar字段。如果我这样插入:

INSERT MyTable 
 SELECT N'the string goes here'
这两者之间有什么根本区别吗

INSERT MyTable 
 SELECT 'the string goes here'
我的理解是,只有当字符串包含Unicode字符且目标列不是Unicode时,才会出现问题。除此之外,SQL很好地处理了它,并将带有
N'
的字符串转换为varchar字段(基本上忽略
N


我觉得在字符串前面写代码< n>代码>是一个很好的实践,但是我找不到任何我认为是决定性的讨论。 当字符串指向
nvarchar(…)
列或参数时,应在其前面加上
N
。如果它们的目的地是
varchar(…)
列或参数,则忽略它,否则将导致不必要的转换

N
粘贴在每个字符串前面,而不管它的用途是什么,这绝对不是“最佳实践”

当引用Unicode字符时 数据类型nchar、nvarchar和ntext, “表达式”的前缀应为 大写字母“N”

也有一个阅读

出现的Unicode字符串常量 在服务器上执行的代码中,例如 在存储过程和触发器中, 必须以大写字母开头 这是真的,即使列 正在引用的已定义为 Unicode。如果没有N前缀,则 字符串转换为默认值 数据库的代码页。今年五月 无法识别某些字符


简短回答:对脚本很好,对生产代码不好

这不被认为是最佳做法。还有一个缺点,当2字节字符转换为1字节字符时,它会对性能造成很小的影响

如果不知道插入的位置,或者不知道源文本来自何处(比如说,这是一个通用数据插入实用程序,可以为未知目标生成插入语句,比如在导出数据时),N'foo'可能是更具防御性的编码样式

所以缺点很小,优点是脚本代码更能适应数据库结构的变化。这可能就是为什么您会在批量数据插入脚本中看到它


但是,如果所讨论的代码是在您关心代码质量的环境中重复使用的,则不应使用
N'the string'
,因为您正在添加一个不需要的转换

但是如果将N放在前面,就不必知道目标列的数据类型。担心额外的转换感觉像是微观优化。@jcollum:事实上,最好的做法是使用实际正确的东西。有人可能在查看您的查询时错误地认为该列支持Unicode字符,而实际上不支持。我想知道的是,为什么这么多工具在字符串前面加上N,而不管目标类型是什么。@jcollum:这是一个很好的问题。可能只是懒惰-对所有字符类型使用相同的代码比基于Unicode设置编写特殊大小写代码更容易。这并没有回答问题。我不是问它为什么在那里。我想知道这是否有负面影响,或者不管怎样,这是否是最好的做法。啊,防御性的,我喜欢这个词+1我认为这一点,再加上上面的一点,就是答案。我想我会编辑这个,并称之为答案。@jcollum:这不仅仅是转换的性能问题。您向未来的维护人员指出了错误的语义。这有点像将谓词写成
,其中SomeCol='1'
,就好像它是
varchar
列,而实际上它是
int
列。它可能会工作,但这并不能减少错误,而且随着脚本的更改,将来可能会导致与排序规则相关的细微错误。生成的代码显然没有书面代码那么高的质量标准;任何代码生成都是如此,请查看Windows窗体背后的设计器代码。@aaron:脚本中有许多地方的日期时间是作为字符串“2010-04-28 12:31AM”传入的。我不明白你说的排序错误是什么意思。也就是说,我不明白要求sql将和nvarchar转换为varchar(在插入列数据之前)如何会导致排序错误。@aaron:我对这个答案的编辑也解决了在生产代码中不这样做的问题,我认为这是适当的。我不认为在脚本中这样做有任何不利之处。如果您看到我没有看到的问题,请举例说明。