【发布时间】:2011-02-23 11:50:18
【问题描述】:
是否有用于转义列名的 SQL 标准?如果不是什么适用于 MySQL 和 SQLite?它也适用于 SQL Server 吗?
【问题讨论】:
标签: sql
是否有用于转义列名的 SQL 标准?如果不是什么适用于 MySQL 和 SQLite?它也适用于 SQL Server 吗?
【问题讨论】:
标签: sql
"
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_IDENTIFIER 为 ON 时才支持它。
【讨论】:
根据SQLite,
'foo' 是一个 SQL 字符串"foo" 是一个 SQL 标识符(列/表/等)[foo] 是 MS SQL 中的标识符`foo` 是 MySQL 中的标识符对于限定名称,语法为:"t"."foo" 或 [t].[foo] 等。
当ANSI_QUOTES 选项被启用时,MySQL 支持标准的“foo”。
【讨论】:
'foo' 解释为标识符,如果上下文不允许标识符,则将"foo" 解释为字符串,但请注意,在未来的版本中可能会删除此行为。
WHERE "nonexistent_column" = 0,sqlite 只是愉快地执行它,假装我的"nonexistent_column" 是一个字符串。将名称完全限定为 "my_table"."nonexistent_column" 会强制 sqlite 表现得更严格。
foo、"foo" 和 'foo' 不适用于 MySQL。它需要反引号。更糟糕的是,MySQL 提供了useless error messages。
对于 MySQL,使用反引号 `。
例如:
SELECT `column`, `column2` FROM `table`
【讨论】:
对于 MS SQL,使用 [ 和 ]
SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
【讨论】:
把一些答案放在一起:
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"
请添加/编辑!
【讨论】:
对于 DBASE/DBF,请使用 [ 和 ]
SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]
【讨论】: