在MySQL中转义关键字时,我是否应该使用反引号?

时间:2011-05-10 15:39:40

标签: mysql sql

MySQL中的所有表名都应该用反引号(`)括起来,以防止与保留关键字冲突吗?我问的原因是因为它们的使用使得SQL不那么便携,因为并非所有数据库都允许反引号。

那么避免包含关键字的表名和列名是更好的做法吗?如果是这样,可以采取哪些措施来降低MySQL在下一版本中添加可能与您的架构冲突的新关键字的风险。

有关于此的最佳做法吗?

7 个答案:

答案 0 :(得分:9)

最便携的方式(在系统之间)是使用双引号,但是,它需要启用ANSI_QUOTES,在大多数安装中默认关闭。

因此,尽管在不同引擎之间保持可用的兼容性(并且不兼容性并不仅限于反引号,而是仅限于MySQL与其他系统之间的其他不同事物),您将破坏{{1}的不同设置之间的兼容性这是更重要的。

避免使用保留关键字始终是最佳解决方案。

答案 1 :(得分:6)

这是一个意见问题。但便携式代码超过了它们的使用范围。正如你所提到的,反引号可以让你使用保留字,这绝不是一件好事。对我来说,这已经证明他们弊大于利。

答案 2 :(得分:3)

  

那么避免包含关键字的表名和列名是更好的做法吗?

简而言之,是的。除了避免明显的候选人之外,你对未来的关键词没有太大的帮助,例如: withwindowover

答案 3 :(得分:3)

一种常见做法是在所有表名前加上几个字母和一个下划线。如果您需要在同一个数据库中容纳两个不同的应用程序,它可以防止冲突,并且您可能永远不会遇到保留字。

答案 4 :(得分:3)

不转义并手动避免与关键字保留名称冲突可能是一项相当繁琐的工作,因为保留名称在数据库之间差异很大。例如,您可以在MySQL中使用User,但不能在MSSQL上使用。

它还归结为SQL查询的目标:它们是表创建查询吗?初始化查询? “常规”查询?这很重要,因为还有其他因素会使SQL数据库依赖(例如在创建表时使用AUTO_INCREMENT)。

它还取决于它是否是手写的SQL文件,您可以直接加载并运行到数据库或以编程方式构建/填充的文件。在后一种情况下,我会使用可用的工具或编写一个封装数据库方言特性的微驱动程序。我们不是在这里讨论ORM,只是有助于将这个问题封装起来。

对我来说,“尽量避免使用”的答案是一种阻力最小的解决方案,可能会或可能不会在某些时候咬你,具体取决于查询的作用。也许你的问题有点过于宽泛?

答案 5 :(得分:3)

我不担心可以通过自动化处理的可移植性问题。

标准SQL对反引号没有任何用处。那么DDL中的反引号是不是只能用SQL标准双引号全局替换?如果是这样,那只是make文件中的一行内容。

答案 6 :(得分:0)

如果使用反引号,如果MySQL引入了新的保留关键字,则可以避免代码停止工作。想象一下,您创建的所有网站都停止工作,因为MySQL更新引入了您之前用作表名的新关键字!

您的SQL可能性稍差,但实际上......用双引号替换反引号是文件中单个搜索/替换的问题(除非您在同一文件中也使用PHP反引号执行运算符) 。你不能反过来做:用双引号替换反引号,因为其他字符串也可能被改变(全部用于PHP“执行”操作符,唉!)!

或者如果您希望代码与两者兼容,您可以在处理/准备SQL的几个函数中进行替换:

function myExecute($sql,$params) {
     if(NOT_MYSQL) $sql=str_replace('`','"',$sql);
     return execute($sql,$params);
}

你应该从不做的是使用双引号将字符串值包含在SQL中。它是允许的,但是对于可移植性来说非常糟糕。您可能必须手动替换所有字符串。

<?php
// Don't. Use ' for strings instead
$sql='SELECT "col1" FROM "tab" WHERE "col2"="very bad"';

// Better
$sql="SELECT `col1` FROM `tab` WHERE `col2`='not that bad'";

// May crash later if tab becomes a keyword (or col1, or col2,..)
$sql="SELECT col1 FROM tab WHERE col2='not that bad'";

// Standard. But harder to replace ""s to ``s later, and annoying \'s in code
$sql='SELECT "col1" FROM "tab" WHERE "col2"=\'not that bad\'';

// Safe. Annoying.
$sql="SELECT my_unique_col1 FROM my_unique_tab WHERE my_unique_col2='not that bad'";

?>

正如您在上一个示例中所看到的,您可以以一种可能唯一的方式命名您的表和字段(为所有人添加一些前缀,在本例中为“my_unique_”),它很无聊,但大多数是安全和便携的。