2010-11-17 93 views
45

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

根据SQL Server的文档CREATE DATABASE,数据库名称必须符合标识符的规则;并且identifiers的规则取决于数据库兼容级别。当兼容级别为100时(根据SQL Server Management Studio的意思是“SQL Server 2008”),名称必须以Unicode字母_,@#开头;后跟一个或多个字母,数字,@,$,#_。文档明确指出,不允许嵌入空格或特殊字符。因为我可以使用SQL Server Management Studio创建名称为This & That | "Other"的数据库 - 它不仅包含嵌入空格(明确禁止),还包含特殊字符(|")甚至在一个文件名中都不是有效的。我检查了一下,数据库的兼容级别确实是“SQL Server 2008(100)”,尽管它的名字在该兼容级别被记录为无效。

哎呀,我甚至可以做CREATE DATABASE " "(是的,这是一个空格),这证明了第一个字符不必须是字母,下划线,@符号,或井号。

所以我想我的问题是,什么字符有效的SQL Server数据库名称?是否有任何符合SQL Server实际行为的书面规则?

+4

是什么在使用无效或极不寻常的字符(个),数据库,表等名称的价值?除了确保那些必须使用数据库的人诅咒你的名字...... – 2010-11-17 00:21:20

+2

这将由用户决定要调用数据库的内容。如果他们想挑选一个可怜的名字,我的理解就是我们不想阻止他们。 (这可能会改变,但我至少想知道我们应该如何处理。) – 2010-11-17 04:21:39

回答

26

rules for identifiers状态在最后:

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

通过选择不符合这些规则数据库名,你必须用双引号或括号总是包围它。

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

下面的说明确定

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

但不

CREATE DATABASE This & That | "Other" 

编辑:

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

+4

好的,我明白了。但是这些文档似乎并没有说明这些引用内容和内容是否有效。这是否意味着任何事情都会发生?非法Unicode字符? '\ 0'?还是还有规则? – 2010-11-17 04:26:05

+5

试试吧!是的,什么都可以。我创建了一个名为〜'^%$£“的数据库名称。 – 2013-01-09 08:56:55

10

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

当您使用周围的标识符引号,这是一个分隔标识符,而你没有被常规标识符的规则的限制。

没有分隔符,你只能遵循常规标识符规则的标识符创建数据库:

create database db_name 

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

create database "That's a funny name, isn't it?" 

create database [)(/%Q)/#&%¤)Q/#)!] 
+2

说明*虽然分隔标识符可以包含除**分隔符以外的任何字符**。我可以简单地键入该字符两次以转义它,例如:** create数据库“”“” **或**甚至创建数据库[]]] ** – Pacerier 2011-07-21 00:58:32

+1

@Pacerier:是的,如果分隔标识符支持逃避,你甚至可以使用标识符中的分隔符 – Guffa 2011-07-21 08:41:06

6

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

+4

没有意义的。究竟它是如何更安全? – Pacerier 2011-07-21 01:00:03

+3

这是真的,它在运行针对可能不采取特殊字符考虑数据库脚本方面更加安全。 – 2012-10-03 14:53:07

+7

@Pacerier,你永远不知道什么系统或代码可以在一定的时间过程的怪诞的数据库名和因为你使用了开发人员的角色,所以即使SQL Server没有问题,他们也是很容易的。 – ProfK 2012-12-13 15:02:42

2

分隔的名字 - 用方括号或双引号(如果QUOTED_IDENTIFIER设置为ON) - 基本上可以包含除分隔符本身以外的任何其他。甚至可以使用名称中的分隔符和一些转义逻辑。请注意,它只是必须转义的关闭转义字符。在下面的第一个例子中,在名称中开口转义字符的单个实例并不需要转义而闭合转义字符并不需要被转义(由具有两个替换单个实例)。我想在这里的逻辑是,无论是解析这些语句代码寻找收盘逃逸的性格和有没有兴趣嵌套开转义字符。

  • [试验[试验] - >测试[试验
  • [试验]]测试] - >测试]测试

以下是围绕所述规则的描述非限定(带引号)标识符名称在SQL Server 2012中。它是文档Guide to Migrating from MySQL to SQL Server 2012的摘录。

架构对象名称

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

不带引号的标识符名称必须遵循这些规则:

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

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

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

相关问题