在字段名称周围使用反引号
在阅读了一些关于一些SQL问题的答案和评论之后,也听说我的一个朋友在一个禁止他们的策略的地方工作,我想知道是否在MySQL的字段名称周围使用反引号有什么问题。
那是:
SELECT `id`, `name`, `anotherfield` ... -- vs -- SELECT id, name, anotherfield ...
使用反引号允许您使用替代字符。 在查询写作这不是一个这样的问题,但如果一个假设你可以只使用反引号,我会认为它可以让你逃避像荒谬的东西
SELECT `id`, `my name`, `another field` , `field,with,comma`
这当然会产生严重的命名表。
如果你只是简明扼要,我没有看到它的问题,你会注意到,如果你这样运行你的查询
EXPLAIN EXTENDED Select foo,bar,baz
生成的警告返回将有反击和完全合格的表名称。 因此,如果您使用查询生成function并自动重新编写查询,反引号将会使您的代码parsing更less。
然而,我认为,不要强制你使用反引号,而应该有一个名称标准。 它解决了更多“真实”的问题。
反引号的唯一问题是它们不符合ANSI-SQL,例如它们在SQL Server中不起作用。
如果有机会,您将不得不将SQL移植到另一个数据库,请使用双引号。
对我来说,处理字段名称时总是使用它们是很有意义的。
- 首先,一旦你养成了这个习惯,只要打开反拨键就不会受伤。
- 其次,对我来说,查看查询中的字段究竟是什么,以及关键字或方法是什么,这样更容易。
- 最后,它允许您在devise桌子时使用任何字段名称。 有时,命名字段“键”,“顺序”或“值”是很有意义的…所有这些在引用它们时都需要反引号。
反引号不是标准的ANSI SQL的一部分。 从mysql手册 :
如果启用了ANSI_QUOTES SQL模式,则也可以在双引号内引用标识符
所以,如果你使用反引号,然后决定离开MySQL,你有一个问题(尽pipe你也可能有更大的问题)
如果继续使用MYSQL,没有任何问题,除了查询的可视化效果。 但是它们允许使用保留关键字或embedded空格作为表名和列名。 对于大多数数据库引擎来说,这是一个不可能的事情,并且会阻止以后的任何迁移。
至于容易阅读,许多人使用SQL关键字大写,例如。
SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
search你的代码库反引用的东西要容易得多。 假设你有一个名为event
的表。 grep -r "event" *
可能会返回数百个结果。 grep -r "\`event\`" *
会返回任何可能引用你的数据库的东西。
那么,就我所知,使用反引号的全部目的是让你可以使用与保留关键字重合的名称。 所以,如果名称不与保留关键字冲突,我看不出有任何使用反引号的理由。 但是,那也不是禁止他们的理由。
如果你问我,总是使用反引号。 但是为什么一个团队可能不喜欢使用它们有一些原因。
优点:
- 使用它们,没有保留字或禁止的字符。
- 在某些情况下,您会收到更多的描述性错误消息。
- 如果你避免不好的做法你不在乎,但是……实际上,有时他们是避免SQL注入的一个体面的方法。
缺点:
- 它们不是标准的,通常也不便携。 但是,只要不使用反引号作为标识符的一部分(这是我能想象到的最糟糕的做法),则可以通过自动移除反引号来移植查询。
- 如果你的一些查询来自Access,他们可能会引用表名“(也许你不能全部删除)。 但是,反引号和双引号的混合是允许的。
- 一些愚蠢的软件或function过滤您的查询,并反向问题。 但是,它们是ASCII的一部分,所以这意味着您的软件/function非常糟糕。
简单的事情“是用于表示标识符如database_name,table_name等,单引号'' ,双引号“”为string文字,而“”用于打印值,因为它和''打印值variables保持或在另一种情况下打印他的文字。
ie 1.-> use `model`; here `model` is database name not conflict with reserve keyword 'model' 2- $age = 27; insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi"); here i used both quote for all type of requirement. If anything not clear let me know..
如果您将某些字段名称用作默认mysql或mssql值(例如“status”),则必须使用反引号(“从table_nameselectstatus
”或“从table_name where select status
= 1中selectID”)。 因为MySQL返回错误或不工作的查询。