【问题标题】:SQL standard to escape column names?SQL标准转义列名?
【发布时间】:2011-02-23 11:50:18
【问题描述】:

是否有用于转义列名的 SQL 标准?如果不是什么适用于 MySQL 和 SQLite?它也适用于 SQL Server 吗?

【问题讨论】:

    标签: sql


    【解决方案1】:

    引号"

    SQL:1999 标准 specifies 使用双引号 (") (QUOTATION MARK) 来分隔标识符。

    <delimited identifier> ::= <double quote> <delimited identifier body> <double quote>
    

    Oracle、PostgreSQL、MySQL、MSSQL 和 SQlite 都支持 " 作为标识符分隔符。

    他们并不都使用" 作为“默认值”。例如,您必须在 ANSI mode 中运行 MySQL,而 SQL Server 仅在 QUOTED_IDENTIFIERON 时才支持它。

    【讨论】:

      【解决方案2】:

      根据SQLite

      • 'foo' 是一个 SQL 字符串
      • "foo" 是一个 SQL 标识符(列/表/等)
      • [foo] 是 MS SQL 中的标识符
      • `foo` 是 MySQL 中的标识符

      对于限定名称,语法为:"t"."foo"[t].[foo] 等。

      ANSI_QUOTES 选项被启用时,MySQL 支持标准的“foo”。

      【讨论】:

      • 请注意,如果上下文不允许使用字符串,SQLite 允许将'foo' 解释为标识符,如果上下文不允许标识符,则将"foo" 解释为字符串,但请注意,在未来的版本中可能会删除此行为。
      • 那么,"t".* 怎么做?
      • @thomasrutter 是的,我完全被这种行为所困扰......尝试使用WHERE "nonexistent_column" = 0,sqlite 只是愉快地执行它,假装我的"nonexistent_column" 是一个字符串。将名称完全限定为 "my_table"."nonexistent_column" 会强制 sqlite 表现得更严格。
      • foo"foo"'foo' 不适用于 MySQL。它需要反引号。更糟糕的是,MySQL 提供了useless error messages
      【解决方案3】:

      对于 MySQL,使用反引号 `。

      例如:

      SELECT `column`, `column2` FROM `table`
      

      【讨论】:

        【解决方案4】:

        对于 MS SQL,使用 [ 和 ]

        SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
        

        【讨论】:

        • 你可以在 ms sql 的列名中有空格!?!
        • 你可以!不过我不会。
        • 是的,您可以在 MSSQL 中使用空格或保留字作为实体名称。你只需要 [ ] 他们。
        • 顺便说一句,如果您在 MS SQL Server 中使用 [ 和 ] 并且您想在名称本身中使用 ] 字符(无论出于何种原因),那么您需要使用另一个 ] 字符对其进行转义(即使用 ]] 代替 ])。
        【解决方案5】:

        把一些答案放在一起:

        MS SQL(又名 T-SQL)、Microsoft Access SQL、DBASE/DBF:SELECT [COLUMN], [COLUMN2] FROM [TABLE]

        MySQL: SELECT `COLUMN`, `COLUMN2` FROM `TABLE`

        SQLite、Oracle、Postgresql:SELECT "COLUMN", "COLUMN2" FROM "TABLE"

        请添加/编辑!

        【讨论】:

          【解决方案6】:

          对于 DBASE/DBF,请使用 []

          SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-01
            • 1970-01-01
            相关资源
            最近更新 更多