在SQL语句中,会使用方括号: [ ]
那么,以下两种方式有啥区别:
SELECT [FirstName] FROM [Contacts]
SELECT FirstName FROM Contacts
包围对象和字段名 Around Object and Field Names
简单地说,方括号被用来转义关键字、保留字或特殊字符。
最常见的是,当人们在给对象和字段命名时使用空格时,我们看到需要使用方括号。 检查一下上面的原始例子,因为没有特殊字符,而且没有一个名字是保留字,所以并不真正需要包括方括号。
也就是说,如果他们不是将字段命名为FirstName,而是将其命名为First Name,那么在字段名周围的方括号就成为必须的。
你可以用方括号来括住名字。如果名称不包含任何空格或特殊字符(如标点符号),方括号是可选的。如果名称中含有空格或特殊字符,你必须使用方括号。
提示:当你设计表格和报告时,包含空格的名称更容易阅读,可以节省你的时间,但最终可能使你在编写SQL语句时输入更多的内容。当你为数据库中的对象命名时,你应该考虑到这一点。
使用方括号有坏处么?
简短的回答,没有。 包括括号没有真正的坏处,即使不是严格必要的。
你会看到许多有经验的开发者使用它们来确保永远不会有任何问题。
例1:
我们看一下在一个表单中寻找第一个匹配项的代码
Sub FrmRequery(frm As Form, sSearchField As String, sSearchTerm As String)
Dim rs As DAO.Recordset
Set rs = frm.RecordsetClone
rs.FindFirst sSearchField & "='" & sSearchTerm & "'"
frm.Bookmark = rs.Bookmark
Set rs = Nothing
End Sub
像下面的代码会更好些:
Sub FrmRequery(frm As Form, sSearchField As String, sSearchTerm As String)
Dim rs As DAO.Recordset
Set rs = frm.RecordsetClone
rs.FindFirst "[" & sSearchField & "]='" & sSearchTerm & "'"
frm.Bookmark = rs.Bookmark
Set rs = Nothing
End Sub
因为第二个将接受任何字段名,而第一个在传递字段名中含有空格或其他特殊字符时将出错。
当编码时,总是假设最坏的情况;一些额外的括号保证你的代码不会被破坏,并能处理任何传给他的数据。
例2:
我们使用脚本创建一个表:
CREATE TABLE Date
(
Id AUTOINCREMENT PRIMARY KEY,
Date DATETIME
);
可能会报错:
Syntax error in CREATE Table statement.
Syntax error in field definition.
为什么? 因为表的名字和字段都是用了保留字“Date”。 因此,如果我们真的想创建这样一个表,这时就会使用方括号,可以这样做:
CREATE TABLE [Date]
(
Id AUTOINCREMENT PRIMARY KEY,
[Date] DATETIME
);
例3:
与前面的例子类似,让我们尝试创建一个名为 "Corporate Contacts"的表,有以下字段。Id, First Name, Last Name, Title, Is Active, Date Created. 如下所示:
CREATE TABLE Corporate Contacts
(
Id AUTOINCREMENT PRIMARY KEY,
First Name CHAR,
Last Name CHAR,
Title CHAR,
Is Active BIT,
Date DATETIME
);
但这将再次失败,由于使用了特殊字符(空格)和保留字,就需要加方括号。 因此,正确的语法应该是:
CREATE TABLE [Corporate Contacts]
(
Id AUTOINCREMENT PRIMARY KEY,
[First Name] CHAR,
[Last Name] CHAR,
Title CHAR,
[Is Active] BIT,
[Date] DATETIME
);
但更好的方法是不使用特殊字符和保留字:
CREATE TABLE CorporateContacts
(
ContactId AUTOINCREMENT PRIMARY KEY,
FirstName CHAR,
LastName CHAR,
Title CHAR,
IsActive BIT,
CreationDate DATETIME
);
总结
现在,从这个讨论中应该有两个主要的收获。
在应用程序中命名任何东西时,不要使用特殊字符(记住,在命名时,空格是不好的!)或保留字!这是所有开发人员的最佳做法。这对任何开发人员来说都是一个最佳实践。
当编写SQL语句和VBA代码时,最好谨慎行事,当你不能控制对象、字段的名称时,就加上括号。
注意:
在SQL Server和MS Access中,方括号在查询过滤器中使用时有特殊含义。方括号用于指定一个字符集或字符范围,如"[A-Z]"可以匹配从'A'到'Z'的任何单个字符。为了明确地匹配方括号,方括号符号必须与字符集中的左括号一起使用,如"[[]"。例如,如果查询的目的是寻找包含精确字符串 "fore [TAG] aft "的字段,则使用 "fore [[]TAG] aft"。注意,右方括号不需要任何特殊处理。
参考:
SQL Statements, To Square Bracket Or Not? | DEVelopers HUT
Using square brackets in query filters on SQL Server and MS Access