假设我有一个包含varchar字段的表。如果我像这样插入:
INSERT MyTable
SELECT N'the string goes here'
它与之间有什么根本区别:
INSERT MyTable
SELECT 'the string goes here'
我的理解是,如果字符串包含Unicode字符且目标列不是unicode,则只会出现问题。除此之外,SQL处理它很好并将带有N''
的字符串转换为varchar字段(基本上忽略N
)。
我的印象是在字符串前N
是一个很好的做法,但我无法找到任何关于它的讨论我认为是确定的。
答案 0 :(得分:6)
如果字符串的目的地为N
列或参数,则应使用nvarchar(...)
作为前缀。如果它们的目的地为varchar(...)
列或参数,则省略它,否则您最终会进行不必要的转换。
将N
放在每个字符串前面绝对不是“最佳做法”,无论它是什么。
答案 1 :(得分:3)
简短回答:对于脚本来说很好,对于生产代码来说很糟糕。
这不是最佳做法。有一个缺点,它会创建一个微小的性能命中,因为2字节字符转换为1字节字符。
如果不知道插入的位置,或者不知道源文本的来源(比如这是一个为未知目标生成插入语句的通用数据插入实用程序,比如导出数据时) ),N'foo'可能是更具防御性的编码风格。
所以缺点很小,好处是你的脚本代码更适应数据库结构的变化。这可能是您在批量数据插入脚本中看到它的原因。
但是,如果有问题的代码是在您关心代码质量的环境中重复使用的,那么您不应该使用N'the string'
,因为您在没有必要的情况下添加转换。
答案 2 :(得分:0)
引用Unicode字符时 数据类型nchar,nvarchar和ntext, 'expression'应该以。为前缀 大写字母'N'。
同时阅读Why do some SQL strings have an 'N' prefix?
和
Server-Side Programming with Unicode
出现的Unicode字符串常量 在服务器上执行的代码中 在存储过程和触发器中, 必须以大写字母开头 N.即使列也是如此 被引用已被定义为 Unicode格式。没有N前缀, 字符串转换为默认值 数据库的代码页。这可能 不认识某些人物。