在脚本中将N放在字符串前面有什么缺点吗?它被认为是“最佳做法”吗?

时间:2010-04-26 19:19:25

标签: 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是一个很好的做法,但我无法找到任何关于它的讨论我认为是确定的。

3 个答案:

答案 0 :(得分:6)

如果字符串的目的地为N列或参数,则应使用nvarchar(...)作为前缀。如果它们的目的地为varchar(...)列或参数,则省略它,否则您最终会进行不必要的转换。

N放在每个字符串前面绝对不是“最佳做法”,无论它是什么。

答案 1 :(得分:3)

简短回答:对于脚本来说很好,对于生产代码来说很糟糕。

这不是最佳做法。有一个缺点,它会创建一个微小的性能命中,因为2字节字符转换为1字节字符。

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

所以缺点很小,好处是你的脚本代码更适应数据库结构的变化。这可能是您在批量数据插入脚本中看到它的原因。

但是,如果有问题的代码是在您关心代码质量的环境中重复使用的,那么您不应该使用N'the string',因为您在没有必要的情况下添加转换。

答案 2 :(得分:0)

来自INSERT (Transact-SQL)

  

引用Unicode字符时   数据类型nchar,nvarchar和ntext,   'expression'应该以。为前缀   大写字母'N'。

同时阅读Why do some SQL strings have an 'N' prefix?

Server-Side Programming with Unicode

  

出现的Unicode字符串常量   在服务器上执行的代码中   在存储过程和触发器中,   必须以大写字母开头   N.即使列也是如此   被引用已被定义为   Unicode格式。没有N前缀,   字符串转换为默认值   数据库的代码页。这可能   不认识某些人物。