60

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

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

这与现有证据背道而驰,因为我可以使用 SQL Server Management Studio 创建一个名称为的数据库This & That | "Other"-- 它不仅包含嵌入的空格(明确禁止),而且还包含特殊字符 ( |, ")在文件名中有效。我检查了一下,数据库的兼容级别确实是“SQL Server 2008 (100)”,尽管它的名称在该兼容级别被记录为无效。

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

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

4

4 回答 4

31

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

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

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

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

以下说明是可以的

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

但不是

CREATE DATABASE This & That | "Other"

编辑:

我同意这不是人们理解链接文档的方式:如果包含标识符后规则不再适用,那么必须遵守标识符规则意味着什么?关于封闭不合格标识符的要点应该是规则的一部分。

于 2010-11-17T00:33:10.390 回答
11

常规标识符和分隔标识符之间存在差异。常规标识符受您提到的限制的约束,而分隔标识符可以包含任何字符(分隔符除外)。

当您在标识符周围使用引号时,它是一个分隔标识符,您不受常规标识符规则的限制。

如果没有分隔符,您只能使用遵循常规标识符规则的标识符创建数据库:

create database db_name

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

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

create database [)(/%Q)/#&%¤)Q/#)!]
于 2010-11-17T00:40:36.623 回答
7

就我个人而言,我会将它们限制为字母和数字,仅此而已(也可能是_)。没有空格,没有有趣的符号,没有回车等。这是你能做的最安全的事情。

于 2010-11-17T15:23:02.440 回答
5

分隔名称 - 用方括号或双引号括起来(如果QUOTED_IDENTIFIER设置为 ON) - 基本上可以包含除分隔符本身之外的任何内容。甚至可以在名称中使用带有一些转义逻辑的分隔符。请注意,它只是必须转义的结束转义字符。在下面的第一个示例中,名称中开始转义字符的单个实例不需要转义,而结束转义字符必须转义(通过用两个替换单个实例)。我想这里的逻辑是,解析这些语句的任何代码都在寻找一个结束转义字符,并且对嵌套的开始转义字符不感兴趣。

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

以下是 SQL Server 2012 中围绕非分隔(非引号)标识符名称的规则的描述。它摘自文档Guide to Migrating from MySQL to SQL Server 2012

架构对象名称

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

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

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

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

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

于 2013-11-15T15:19:27.780 回答