2012-03-15 182 views
12

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

SELECT `username` FROM `users` 
SELECT [username] FROM [users] 
+1

方括号与MySQL兼容吗?在SQL Server中,你也可以使用“if QUOTED_IDENTIFIER”开启,如果在MySQL中有效,你也可以不知道。 – 2012-03-15 12:41:59

+0

你说的没错,不是它们不兼容,我认为它们是! – 2012-03-15 12:46:52

+1

如果你使用括号,关键字或特殊字符,也可以使用方括号表示使用保留字作为字段名称的方式(例如[日期]) – 2012-03-15 12:46:27

回答

18

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

据我所知,可以用turn up in documentation或者在测试中使用,方括号是而不是对MySQL有效。因此,如果您需要在SQL Server中将关键字作为表名称,请使用[],而在MySQL中使用反引号或在启用ANSI_QUOTES时使用双引号。

From the documentation:

标识符引号字符是倒引号(“`”):如果启用了ANSI_QUOTES SQL模式

mysql> SELECT * FROM `select` WHERE `select`.id > 100; 

,它也允许引用标识符在双引号内:

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) 
+2

+1 - '[]'对于T-SQL来说非常独特,我不确定任何其他类型的SQL都可以接受它们。 – MatBailie 2012-03-15 12:42:22

+0

这非常有趣,我们都相信方括号可以在任何地方使用,我们刚刚使用MySQL进行了测试,您是对的!:-) – 2012-03-15 12:44:23

+2

SQL Server中的方括号也用于Microsoft Access,其中列名和表名中的嵌入空格很常见。你需要一些很容易输入的东西。试图找出如何键入反引号可能是谋杀。 – 2012-03-15 12:50:14

5

这两种都是引用对象名称的非标准方法,它们应该区分大小写,是保留字还是包含不允许的特殊字符。

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

SELECT "username" FROM "users" 

但请注意,带引号的标识符按照ANSI SQL区分大小写。然而这两个提到的产品都不符合这个要求。这种标识符是否区分大小写取决于MySQL中的几个(不同的)配置设置以及MS SQL Server中的数据库归类。

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

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

+0

我完全避免包含保留名称或特殊字符的任何字段或表名,但是,因为我正在编写一个可以使用的MsSQL类由于经验不足的人,我必须照顾他们,因此,我需要用方括号将每个字段和表格包装起来以防止出错,因为它没有使用更多的资源(如果有的话),我可能会它 – 2012-03-15 13:08:37

相关问题