【问题标题】:What is the syntax of a string literal in T-SQL?T-SQL 中字符串文字的语法是什么?
【发布时间】:2020-07-15 14:33:06
【问题描述】:

T-SQL 中字符串文字的完整语法是什么?

我在官方文档中找不到任何明确的字符串语法定义,而且我能找到的任何博客文章都只提到了某些方面(如N 前缀)。此外,Stack Overflow 或其他网站上询问如何转义字符串的任何帖子都有指向使用参数而不是回答问题的答案,这并没有提供我正在寻找的信息。

据我所知,字符串文字以可选的N 开头,后跟单引号(或双引号,如果以某种方式设置),字符串中的单引号通过加倍转义单引号和反斜杠通过加倍反斜杠进行转义(可能仅当设置以某种方式设置时?)。

此信息是否有权威和/或全面的来源?即使只是保留/特殊字符的列表也会比我能找到的要好。

【问题讨论】:

  • 您是否参考过本文档? docs.microsoft.com/en-us/sql/t-sql/data-types/….
  • 反斜杠在 tsql 中没有特定含义。大概您的上下文是另一种语言,例如 csharp ,确实需要对其进行转义。如果是这样,你应该说清楚。
  • 文档确实在Character string constants 的第三段中提到了单引号需要转义。其他任何东西都只是一个角色。没有转义序列。 SQL,语言本身,在文本处理方面并不出色,而 T-SQL 比平常更糟糕。输入制表符或非英文字符很简单——只需输入字符即可。没必要逃跑
  • @GPHemsley 如果你这样做了,它可能会被否决。你还没有问一个具体的问题。很明显,您有一些 other 问题,并认为转义是一种解决方案。这不是
  • 你明白了,实际上是在发布问题之前阅读的所有文章和文档中自己发现的。除了转义单引号之外,没有特殊的语法。这就是为什么所有文章和 SO 答案都说您应该使用参数化查询

标签: sql sql-server tsql


【解决方案1】:

字符串文字是用单引号 (') 括起来的任何内容。 N 前缀不是“可选的”,它意味着后面的字符串使用国家语言字符集。不带N 前缀的字符串是varchar,带前缀的是​​nvarchar

【讨论】:

  • 这不能回答我的问题。
  • @GPHemsley:是的。至少是一个问题“什么是字符串文字的完整语法
  • @a_horse_with_no_name 我正在寻找具有语法定义(如正则表达式或 ABNF)而不是散文定义的技术答案。这个答案甚至没有提到转义单引号。
  • @GPHemsley 你得到了你发布的问题的答案。 real 问题,为什么字符串连接会产生无效的 SQL 语句,是完全不同的。答案是just don't do it。使用参数化查询或 SqlBulkCopy 更容易、更快(按数量级)和无限安全
  • XY Problem@GPHemsley 的经典示例。你问了 Y,得到了 Y 的答案。显然 Y 没有回答 X,因此 Y 的答案在你眼中“不是”Y 的答案,即使它实际上是。问 X,得到 X 的答案。
【解决方案2】:

我找不到的文档在这里(感谢@GordonLinoff): https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql?view=sql-server-ver15

字符串常量用单引号括起来,包括字母数字字符(a-z、A-Z 和 0-9)和特殊字符,例如感叹号 (!)、at 符号 (@) 和数字符号 (#) .

如果连接的 QUOTED_IDENTIFIER 选项已设置为 OFF,字符串也可以用双引号引起来,但 Microsoft SQL Server Native Client Provider 和 ODBC 驱动程序会自动使用 SET QUOTED_IDENTIFIER ON。我们建议使用单引号。

如果用单引号括起来的字符串中包含嵌入的引号,则用两个单引号表示嵌入的单引号。这在嵌入双引号的字符串中不是必需的。

Unicode 字符串的格式类似于字符串,但前面有一个 N 标识符(N 代表 SQL-92 标准中的国家语言)。 N 前缀必须为大写。

因此,根据该定义,推荐格式的 Unicode 字符串具有以下语法(如 PCRE):

N'(?:[^']|'')*'

【讨论】:

  • 如您所愿,技术上精确 您可以添加,默认情况下,N 并不表示 unicode,而只是范围由UCS-2-encoding 覆盖。从 v2019 开始,增强功能涵盖了具有特殊排序规则的补充字符,read this
猜你喜欢
  • 2015-06-11
  • 2020-10-27
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多