提问人:nickf 提问时间:11/4/2008 最后编辑:Blaszardnickf 更新时间:1/25/2019 访问量:106042
在字段名称周围使用反引号
Using backticks around field names
问:
在阅读了这里一些SQL问题的一些答案和评论之后,还听说我的一个朋友在一个有禁止他们的政策的地方工作,我想知道在MySQL中对字段名称使用反引号是否有任何问题。
那是:
SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
答:
好吧,据我所知,使用反引号的全部目的是让您可以使用与保留关键字一致的名称。因此,如果名称没有与保留关键字冲突,我认为没有任何理由使用反引号。但是,这也不是禁止它们的理由。
对我来说,在处理字段名称时始终使用它们很有意义。
- 首先,一旦你养成了习惯,只需点击反引号键也没有什么坏处。
- 其次,对我来说,它可以更容易地查看查询中的字段到底是什么,以及什么是关键字或方法。
- 最后,它允许您在设计表时使用所需的任何字段名称。有时,将字段命名为“键”、“顺序”或“值”很有意义......所有这些都在引用它们时需要反引号。
评论
反引号的唯一问题是它们不符合 ANSI-SQL,例如,它们在 SQL Server 中不起作用。
如果有可能将 SQL 移植到另一个数据库,请使用双引号。
评论
range
app_key_stores
app_key_stores
key
使用反引号允许您使用替代字符。在查询写作中,这不是一个问题,但是如果有人假设你可以只使用反引号,我会认为它可以让你摆脱荒谬的东西,比如
SELECT `id`, `my name`, `another field` , `field,with,comma`
这当然会产生名称错误的表。
如果你只是简明扼要,我看不出有什么问题, 如果以这种方式运行查询,则会注意到
EXPLAIN EXTENDED Select foo,bar,baz
返回的生成警告将具有反引号和完全限定的表名。因此,如果您使用查询生成功能和自动重写查询,则反引号将使解析代码的任何内容都变得不那么混乱。
然而,我认为,与其强制要求你是否可以使用反引号,不如让他们有一个名称标准。它解决了更多“真实”的问题。
评论
select count from foo
select "count" from foo
""
反引号不是标准 ANSI SQL 的一部分。从 mysql 手册:
如果 ANSI_QUOTES SQL 模式是 启用,也允许引用 双引号内的标识符
因此,如果您使用反引号,然后决定离开MySQL,那么您就有问题了(尽管您可能也有更大的问题)
如果您继续使用 MYSQL,则没有任何问题,除了查询的视觉模糊。但它们确实允许使用保留关键字或嵌入空格作为表名和列名。这是大多数数据库引擎的禁忌,并且会阻止以后进行任何迁移。
至于易于阅读,许多人对 SQL 关键字使用大写字母,例如。
SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
在代码库中搜索反引号要容易得多。假设您有一个名为 的表。 可能会返回数百个结果。 将返回任何可能引用您的数据库的内容。event
grep -r "event" *
grep -r "\`event\`" *
评论
如果你问我,应该始终使用反引号。但是,团队可能不愿意使用它们有一些原因。
优势:
- 使用它们,没有保留词或禁止的字符。
- 在某些情况下,您会收到更具描述性的错误消息。
- 如果你避免不良行为,你不在乎,但是......实际上,有时它们是避免SQL注入的不错方法。
弊:
- 它们不是标准的,通常不便携。但是,只要您不使用反引号作为标识符的一部分(这是我能够想象到的最糟糕的做法),您就可以通过自动删除反引号来移植您的查询。
- 如果您的某些查询来自 Access,它们可能会用 “ 引用表名(也许您不能盲目删除所有 ”)。但是,允许混合使用反引号和双引号。
- 一些愚蠢的软件或函数会过滤您的查询,并且存在反引号问题。但是,它们是 ASCII 的一部分,因此这意味着您的软件/功能非常糟糕。
评论
如果使用某些字段名称作为默认MySQL或MSSQL值,例如“status”,则必须使用反引号(“select from table_name”或“select id from table_name where =1”)。
因为 MySQL 返回错误或查询不起作用。status
status
关于反引号的简单事情 '' 用于表示标识符,如 database_name、table_name 等,单引号 ''、双引号 “” 用于字符串文字,而 “” 按原样用于打印值,而 '' 打印值变量 hold 或在另一种情况下打印他拥有的文本。
i.e 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..
反引号 (') 在 SQL 中的主要用途是在即将到来的子句中再次调用它们的情况下使用它们。每隔一段时间,建议使用双引号(“”)。
例如
SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
COUNT(ISBN) AS "# Books",
MAX(LENGTH(title)) AS "Longest Title",
MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;
在上面的语句中,你是否看到如何在子句中再次使用。Publisher and Location
GROUP BY
而不是使用
分组依据 姓名、城市、州代码
我刚刚用过
分组依据
Publisher and Location
只有当出现这种情况时,使用反引号才有用。在所有其他时间,建议使用双引号。
上一个:外键命名方案
下一个:如何合并两个 jQuery 结果
评论
count
type
table
count
type
table