什么字符在SQL Server数据库名称中有效?

我们将为我们的客户提供一个工具(其中包括)创build一个新的SQL Server数据库,我希望能够对他们提供的数据库名称进行基本的validation。 SQL Server的文档解释了什么字符在数据库名称中是有效的。 但是,文档显然不正确,因为我可以成功地创build名称违反了文档规则的数据库。

根据SQL Server的CREATE DATABASE文档,数据库名称必须符合标识符的规则; 而标识符的规则取决于数据库的兼容性级别。 当兼容级别为100时(根据SQL Server Management Studio的意思是“SQL Server 2008”),名称必须以Unicode字母_@#开头。 后跟一个或多个字母,数字, @$#_ 。 文档中明确指出不允许embedded空格或特殊字符。

由于我可以使用SQL Server Management Studio来创build一个名为This & That | "Other"的数据库, This & That | "Other" – 它不仅包含embedded空格(明确禁止),而且包含特殊字符( |" ),这些特殊字符甚至在文件名中都不是有效的。我检查了数据库的兼容级别确实是”SQL Server 2008 100)“,尽pipe其名称在该兼容级别被logging为无效。

哎呀,我甚至可以做CREATE DATABASE " " (是的,这是一个空格),这certificate第一个字符不一定是字母,下划线,符号或英镑符号。

所以我想我的问题是,哪些字符在SQL Server数据库名称有效? 是否有与SQL Server的实际行为一致的书面规则?

标识符的规则在最后说明:

在Transact-SQL语句中使用标识符时,不符合这些规则的标识符必须用双引号或方括号来分隔。

通过select不符合这些规则的数据库名称,您必须始终用双引号或括号括起来。

如果遵守常规标识符的规则,则可以使用不带引号/括号的数据库名称。

以下说明可以

 CREATE DATABASE [conformingName] CREATE DATABASE conformingName CREATE DATABASE [This & That | "Other"] 

但不是

 CREATE DATABASE This & That | "Other" 

编辑:

我同意这不是如何理解链接的文档: 必须符合标识符的规则意味着一旦标识符被包含,规则就不再适用了? 关于包含不符合标识符的观点应该是规则的一部分。

常规标识符和分隔标识符有区别。 常规标识符受您提到的限制的约束,而分隔标识符可以包含任何字符(分隔符除外)。

由于您在标识符周围使用引号,因此它是一个分隔标识符,并且不受常规标识符规则的限制。

没有分隔符,您只能创build符合常规标识符规则的标识符的数据库:

 create database db_name 

使用分隔符,您可以使用几乎任何东西:

 create database "That's a funny name, isn't it?" create database [)(/%Q)/#&%¤)Q/#)!] 

就我个人而言,我会限制他们的字母和数字,没有别的(也可能也是_)。 没有空格,没有有趣的符号,没有回车等。这是最安全的,你可以做的。

分隔名称 – 用方括号或双引号(如果QUOTED_IDENTIFIER设置为ON)包围 – 基本上可以包含除分隔符之外的任何其他内容。 甚至有可能使用名称中的分隔符和一些转义逻辑。 请注意,它只是必须转义的closures转义字符。 在下面的第一个示例中,名称中打开转义字符的单个实例不需要转义,而closures转义字符不必转义(通过用两个replace单个实例)。 我猜这里的逻辑是,parsing这些语句的任何代码都在寻找一个closures转义字符,并且对嵌套的打开转义字符不感兴趣。

  • [testing[testing] – >testing[testing
  • [testing]]testing] – >testing]testing

以下是有关SQL Server 2012中非分隔(非引用)标识符名称的规则的说明。它是从MySQL迁移到SQL Server 2012的文档摘录。

模式对象名称

在SQL Server 2012中,对象名称最多可以有128个字符。

非引用标识符名称必须遵循以下规则:

  • 第一个字符必须是字母数字,下划线(_),符号(@)或数字符号(#)。
  • 后续字符可以包括字母数字字符,下划线,(@)号,数字符号或美元符号。
  • 标识符不能是Transact-SQL保留字。 从MySQL迁移到SQL Server 2012的指南8
  • embedded的空格或特殊字符是不允许的。

以@或数字符号开头的标识符具有特殊的含义。 以@开始的标识符是局部variables名称。 那些以数字开头的是临时表名。

要在Transact-SQL中引用标识符名称,您必须使用方括号([])。