SQL语句中的反引号和方括号有什么区别?

Ben*_*rey 14 mysql sql sql-server-2008

我以为会有另外一个问题,但我无法找到.在使用PHP的MySQL中,我通常使用反引号封装我的字段名称以掩盖任何保留的名称或字符.但是,我的一位同事指出,这也可以使用方括号来实现.排除反引号与SQL服务器不兼容的事实(显然),有什么区别?我应该使用哪个?

SELECT `username` FROM `users`
SELECT [username] FROM [users]
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 24

SQL Server/T-SQL使用方括号(以及MS Access),而MySQL使用反引号.

据我所知,可以在文档中露面,或在测试中使用,方括号是不是有效的MySQL.因此,如果您需要在SQL Server中将关键字作为表名[]附加,请使用,并在MySQL中使用反引号或ANSI_QUOTES启用时使用双引号.

从文档:

标识符引号字符是反引号("`"):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Run Code Online (Sandbox Code Playgroud)

如果启用了ANSI_QUOTES SQL模式,则还允许在双引号内引用标识符:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • +1 - `[]`对于T-SQL来说几乎是独一无二的,我不确定任何其他类型的SQL都接受它们. (2认同)
  • SQL Server中的方括号也用于Microsoft Access,其中列和表名称中的嵌入空格非常常见.你需要一些相当容易打字的东西.试图找出如何键入反引号可能是谋杀. (2认同)

a_h*_*ame 5

两者都是引用对象名称的非标准方式,这些对象名称应区分大小写,是保留字或包含否则不允许的特殊字符.

这种标识符的标准引用字符是双引号.要与ANSI SQL兼容,您应该使用它们:

SELECT "username" FROM "users"
Run Code Online (Sandbox Code Playgroud)

但请注意,引用的标识符符合ANSI SQL的区分大小写.但是,两种提到的产品都不符合这一要求.此类标识符是否区分大小写取决于MySQL中的多个(不同)配置设置和MS SQL Server中的数据库排序规则.

两个DBMS都可以(并且在我看来应该)配置为接受ANSI标准引号字符.

我强烈建议避免任何需要引用的对象名称.使用不需要引用的标识符可以为您节省很多麻烦.