什么字符在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中引用标识符名称,您必须使用方括号([])。