代码之家  ›  专栏  ›  技术社区  ›  jcollum

在脚本中把n放在字符串前面是否有缺点?是否被视为“最佳实践”?

  •  11
  • jcollum  · 技术社区  · 14 年前

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

    INSERT MyTable 
     SELECT N'the string goes here'
    

    这与以下两者之间是否有根本区别:

    INSERT MyTable 
     SELECT 'the string goes here'
    

    我的理解是,只有字符串包含Unicode字符,而目标列不是Unicode,您才会遇到问题。除此之外,SQL可以很好地处理它,并使用 N'' 变为varchar字段(基本上忽略 N )

    我觉得 n 在弦乐面前是一个很好的练习,但我找不到任何我认为是决定性的讨论。

    3 回复  |  直到 12 年前
        1
  •  3
  •   jcollum    14 年前

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

    这不是最佳实践。有一个缺点,当2个字节的字符转换为1个字节的字符时,它会造成非常小的性能损失。

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

    因此,缺点很小,好处是脚本代码更适合数据库结构的更改。这可能就是您在批量数据插入脚本中看到它的原因。

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

        2
  •  6
  •   Aaronaught    14 年前

    字符串的前缀应为 N 当他们注定 nvarchar(...) 列或参数。如果他们注定 varchar(...) 列或参数,然后省略它,否则将导致不必要的转换。

    坚持下去绝对不是“最佳实践” n 在每根绳子前面,不管它是用来干什么的。

        3
  •  0
  •   Adriaan Stander    14 年前

    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前缀, 字符串转换为默认值 数据库的代码页。这可能 无法识别某些字符。