小思考学习记录

32 阅读1分钟

思考:

sqlserver 在查询页面中为啥字符串/字符都是用单引号包裹的,为啥不用双引号呢?

原因:

在 SQL Server(以及几乎所有关系型数据库)里,单引号 ' 是唯一的字符串定界符,双引号 " 被留给了另外一项任务——“分隔标识符”。
换句话说,两套符号各司其职,不能互换。

  1. 单引号 '
    只用来包裹字符/字符串常量。

    SELECT * FROM Users WHERE UserName = '张三';
    
  2. 双引号 "
    只在分隔标识符(Delimited Identifier)模式下用来包裹对象名(表名、列名、别名等),目的是避开保留字或特殊字符。
    该模式由 SET QUOTED_IDENTIFIER 控制,默认 ON。

    -- 列名里带空格,必须分隔
    SELECT [Order Date]        -- 方括号也行
    FROM dbo."Order Details"   -- 双引号包裹表名
    WHERE "Order Status" = 'NEW';
    
  3. 历史与标准

    • SQL 标准本身就是这样规定的(字符串常量用单引,分隔标识符用双引)。
    • 早期 Sybase → SQL Server 直接继承;Oracle、MySQL、PostgreSQL 同样遵守。
    • 如果硬把双引号当字符串用,解析器会把它当成对象名,立即报错:
      Msg 207, Level 16, State 1 … 无效列名 'abc'
  4. 小结
    单引号 = 字符串;双引号(或方括号) = 对象名。
    这样分开后,语法解析器一眼就能区分“值”和“名”,既符合标准,也避免歧义。