思考:
sqlserver 在查询页面中为啥字符串/字符都是用单引号包裹的,为啥不用双引号呢?
原因:
在 SQL Server(以及几乎所有关系型数据库)里,单引号 ' 是唯一的字符串定界符,双引号 " 被留给了另外一项任务——“分隔标识符”。
换句话说,两套符号各司其职,不能互换。
-
单引号
'
只用来包裹字符/字符串常量。SELECT * FROM Users WHERE UserName = '张三'; -
双引号
"
只在分隔标识符(Delimited Identifier)模式下用来包裹对象名(表名、列名、别名等),目的是避开保留字或特殊字符。
该模式由 SET QUOTED_IDENTIFIER 控制,默认 ON。-- 列名里带空格,必须分隔 SELECT [Order Date] -- 方括号也行 FROM dbo."Order Details" -- 双引号包裹表名 WHERE "Order Status" = 'NEW'; -
历史与标准
- SQL 标准本身就是这样规定的(字符串常量用单引,分隔标识符用双引)。
- 早期 Sybase → SQL Server 直接继承;Oracle、MySQL、PostgreSQL 同样遵守。
- 如果硬把双引号当字符串用,解析器会把它当成对象名,立即报错:
Msg 207, Level 16, State 1 … 无效列名 'abc'。
-
小结
单引号 = 字符串;双引号(或方括号) = 对象名。
这样分开后,语法解析器一眼就能区分“值”和“名”,既符合标准,也避免歧义。