Mysql 在字段名周围使用反勾号
在这里阅读了一些关于SQL问题的答案和评论,还听说我的一个朋友在一个有禁止使用这些问题的政策的地方工作,我想知道在MySQL中使用字段名的倒勾是否有什么问题 即:Mysql 在字段名周围使用反勾号,mysql,backticks,Mysql,Backticks,在这里阅读了一些关于SQL问题的答案和评论,还听说我的一个朋友在一个有禁止使用这些问题的政策的地方工作,我想知道在MySQL中使用字段名的倒勾是否有什么问题 即: SELECT `id`, `name`, `anotherfield` ... -- vs -- SELECT id, name, anotherfield ... 嗯,据我所知,使用反勾号的全部目的是让您可以使用与保留关键字一致的名称。因此,如果名称没有与保留关键字冲突,我看不出有任何理由使用反勾号。但是,这也不是禁止它们的理由。
SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
嗯,据我所知,使用反勾号的全部目的是让您可以使用与保留关键字一致的名称。因此,如果名称没有与保留关键字冲突,我看不出有任何理由使用反勾号。但是,这也不是禁止它们的理由。对我来说,在处理字段名时始终使用它们是很有意义的
- 首先,一旦你养成了这个习惯,只要按一下后退键就没什么坏处了李>
- 其次,对我来说,它更容易查看查询中的字段,以及关键字或方法
- 最后,它允许您在设计表时使用任何字段名。有时将字段命名为“键”、“顺序”或“值”很有意义。。。所有这些在引用它们时都需要反勾号
- 反勾号的唯一问题是它们不符合ANSI-SQL标准,例如,它们不能在SQL Server中工作
如果您可能需要将SQL移植到另一个数据库,请使用双引号。使用反勾号可以使用其他字符。在查询编写中,这并不是一个问题,但如果有人假设您可以只使用backticks,那么我会假设它可以让您摆脱诸如
SELECT `id`, `my name`, `another field` , `field,with,comma`
这当然会生成名称不正确的表
如果你只是说得简洁一点我看不出有什么问题,
如果这样运行查询,您会注意到
EXPLAIN EXTENDED Select foo,bar,baz
返回的生成警告将具有返回标记和完全限定表名。因此,如果您正在使用查询生成功能和自动重新编写查询,反勾号将使解析代码的任何内容都不那么混乱
然而,我认为,它们应该有一个名称标准,而不是强制规定是否可以使用反勾号。它解决了更多的“真实”问题 反勾号不是标准ANSI SQL的一部分。发件人: 如果ANSI_QUOTES SQL模式为 启用后,也允许引用 双引号内的标识符
因此,如果您使用backticks,然后决定离开MySQL,您会遇到一个问题(尽管您可能也有更大的问题)如果您继续使用MySQL,除了查询的视觉模糊性之外,没有任何问题。但它们允许使用保留关键字或嵌入空格作为表名和列名。这对于大多数数据库引擎来说都是不允许的,并且将阻止以后的任何迁移 为了便于阅读,许多人使用大写的SQL关键字,例如
SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
在代码库中搜索backticks中的内容要容易得多。假设您有一个名为
event
的表grep-r“event”*
可能会返回数百个结果grep-r“\`event\`”*
将返回任何可能引用数据库的内容 如果你问我,应该总是使用反勾号。但是有一些原因可以解释为什么一个团队不愿意使用它们
优点:
- 使用它们,没有保留字或禁止字符
- 在某些情况下,您会收到更多描述性错误消息
- 如果你避免不良行为,你不在乎,但是。。。实际上,有时候它们是避免SQL注入的一种不错的方法
- 它们不是标准的,通常不便于携带。但是,只要不将反勾号用作标识符的一部分(这是我能想象到的最糟糕的做法),就可以通过自动删除反勾号来移植查询
- 如果您的一些查询来自Access,它们可能会引用带有“(并且可能您不能盲目地删除所有的”)的表名。但是,允许混合使用反勾号和双引号
- 一些愚蠢的软件或函数会过滤你的查询,并且会出现反勾号问题。但是,它们是ASCII的一部分,因此这意味着您的软件/功能非常糟糕
status
”或“从table\u name中选择id,其中status
=1”)。
因为mysql返回错误或无法进行查询。关于backtick的简单事情是,`用于表示标识符,如数据库名称、表名称等,而单引号',双引号'用于字符串文本,而用于按原样打印值和“”打印值变量hold,或在另一种情况下打印his拥有的文本
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中backticks(`)的主要用途是在接下来的子句中将再次调用它们的情况下使用它们。建议每隔一次使用双引号(“”)
比如说
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;
在上面的语句中,您是否看到了在GROUP BY
子句中如何再次使用发布者和位置
而不是使用
按名称、城市、州代码分组
我刚用过
按发布者和位置分组
只有在出现这种情况时,才使用反勾号。在所有其他情况下,建议使用双引号。是的。使用MySQL的ANSI模式——在MySQL中启用双引号,从而恢复跨数据库兼容性。反勾号/引号也是必要的,因为您永远不知道在未来的DBMS版本中什么将成为保留字。这是千真万确的!我们的一个服务器应用程序运行良好,直到我们对数据库引擎进行了升级,添加了一个新的关键字。突然,查询特定表的所有内容都中断了。@bobince当我刚接触dev时,我命名了一个列range
或类似的东西。当我们升级到MySQL 5时失败了,因为它