2011-05-10 25 views
10

是否应该在反引号(`)中包含MySQL中的所有表名以防止与保留关键字冲突?我问的原因是因为它们的使用使得SQL的可移植性降低,因为并非所有的数据库都允许反引号。在MySQL中转义关键字时,我应该使用反引号吗?

那么避免包含关键字的表名和列名是一个更好的行为?如果是的话,可以采取什么措施来缓解MySQL在下一个版本中添加可能与您的模式冲突的新关键字的风险。

对此有最佳做法吗?

回答

9

最简便的方式(系统之间)是用双引号,但是,这需要使ANSI_QUOTES这是默认关闭的大多数安装。因此,尽管在不同引擎之间保持可辩论有用的兼容性(并且不兼容性不仅限于反引号,而且还涉及MySQL与其他系统之间不同的其他事物),但是您正在破坏不同设置之间的兼容性,这是迄今为止更多重要。

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

+1

你也应该避免将来保留的关键字,以及其他数据库保留的关键字,现在和将来...所以相应地命名你的表和字段:my_unique_table,my_unique_index,my_unique_title等。 – FrancescoMM 2015-01-23 16:38:02

3

那么避免包含关键字的表名和列名是更好的行为?

总之,是的。除了避免显而易见的候选人之外,关于未来关键字的事情并不多。 withwindowover

+0

'如果是的话,可以采取什么措施来缓解MySQL在下一个版本中添加新的关键字的风险,这可能与您的模式冲突? – Treffynnon 2011-05-10 15:42:47

+0

是的,我之后立即添加了。 :-) – 2011-05-10 15:43:49

+0

我刚注意到。谢谢!我有点快:-) – Treffynnon 2011-05-10 15:45:10

5

这是一个意见问题。但便携式代码超过了他们的使用。正如你所指出的,反引号可以让你使用保留字,这从来都不是好事。对我来说,这已经证明他们做的不仅仅是好事。

3

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

3

不能转义和手动避免与关键字的保留名称冲突可能是相当繁琐的尝试,因为保留名称在各个数据库之间差别很大。例如,您可以在MySQL中使用用户,但不能在MSSQL上使用。

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

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

对我来说,“尽量避免它们”的答案是一条阻力最小的解决方案,根据您的查询的作用,可能会或可能不会阻止您回到某个点。也许你的问题有点太广泛了?

3

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

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

+0

同意。我更害怕大量的旧程序停止工作,没有明显的原因,因为MySQL引入了一个新的保留关键字,而不是必须用文件中的引用替换每个反引号! – FrancescoMM 2015-01-23 16:04:07

0

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

您的SQL可能会稍微不便于使用,但真的..用双引号替换反引号是一个文件中的单个搜索/替换问题(除非您在同一个文件中也使用PHP反引号执行运算符)。你不能这样做:反向替换双引号,因为其他字符串也可能被改变(全部转换为PHP“execute”运算符,唉!)!

或者,如果你想要的代码能够同时与兼容,你可以做内部的流程/编写SQL几个函数替换:

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

你应该NEVER做的是使用的是什么双引号在SQL中包含字符串值。它被MySQL允许,但对可移植性非常不利。您可能需要手动更换所有字符串。

<?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_”),它是枯燥的,但主要是安全,便携。

相关问题