【问题标题】:Using backticks around field names在字段名称周围使用反引号
【发布时间】:2010-09-20 15:50:28
【问题描述】:

在这里阅读了一些关于一些 SQL 问题的答案和 cmets 之后,还听说我的一个朋友在一个有禁止他们的政策的地方工作,我想知道在字段周围使用反引号是否有什么问题MySQL 中的名称。

即:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

【问题讨论】:

  • 如果你想拥有像counttypetable或类似的列名,反引号真的很方便
  • @knittl 我认为问题是,应该你有像counttypetable这样的列名。这些是非常模棱两可的术语,几乎在每种情况下,这些名称都可以改进得更具体。像这样为列命名也是危险的,也是潜在的错误来源,因为您永远不知道何时有人可能会忘记添加反引号或没有意识到他们必须这样做。我认为最好避免使用保留术语作为列名。
  • 我一直在使用它们,所以我在任何时候都使用保留关键字不会有危险。

标签: mysql backticks


【解决方案1】:

使用反引号允许您使用替代字符。在查询写作中这不是一个问题,但如果有人假设你可以只使用反引号,我会假设它可以让你摆脱荒谬的事情,比如

SELECT `id`, `my name`, `another field` , `field,with,comma` 

这当然会生成命名错误的表。

如果您只是简明扼要,我认为它没有问题, 如果您这样运行查询,您会注意到

EXPLAIN EXTENDED Select foo,bar,baz 

返回的生成警告将带有反引号完全限定的表名。因此,如果您正在使用查询生成功能和查询的自动重写,反引号将使解析代码的任何内容变得不那么混乱。

但是,我认为,与其规定是否可以使用反引号,不如说它们应该有一个名称标准。它解决了更多“真正的”问题。

【讨论】:

  • 我们还需要在 PostgreSQL 中使用它们吗?
  • 没有必要,只有推荐。如果将来添加一个共享您的字段名称的 SQL 关键字,则将它们表示为引用以避免与 SQL 关键字产生歧义是有用的。您/需要/引用的唯一时间是当字段确实共享关键字名称时,例如,select count from fooselect "count" from foo 将给出非常不同的结果。但是 postgres 与 mysql 有 2 个不同之处: 1. 字段由"" 引用。 2. 不带引号的字段不区分大小写postgresql.org/docs/current/static/…
【解决方案2】:

反引号的唯一问题是它们不符合 ANSI-SQL,例如它们在 SQL Server 中不起作用。

如果您必须将 SQL 移植到另一个数据库,请使用双引号。

【讨论】:

  • 是的。使用 MySQL 的 ANSI 模式 - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - 在 MySQL 中启用双引号,从而重新获得跨数据库兼容性。反引号/引号也是必要的,因为您永远不知道在未来的 DBMS 版本中什么会成为保留字。
  • 确实如此!我们的一个服务器应用程序运行良好,直到我们对数据库引擎进行了升级,该引擎添加了一个新关键字。突然间,查询特定表的所有内容都中断了。
  • @bobince 当我是 new 开发人员时,我将一个列命名为 range 或类似名称。当我们升级到 MySQL 5 时它失败了,因为它是一个新的保留字!
  • 不要使用双引号。它并不总是有效。例如... DELETE FROM app_key_stores WHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range');查询正常,0 行受影响(0.00 秒)从app_key_stores WHERE 删除(key = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range');查询正常,5 行受影响(0.00 秒)
【解决方案3】:

对我来说,在处理字段名称时始终使用它们很有意义。

  • 首先,一旦你养成了这个习惯,按一下反引号键并没有什么坏处。
  • 其次,对我来说,它可以让您更轻松地查看查询中的确切字段是什么,以及关键字或方法是什么。
  • 最后,它允许您在设计表格时使用您希望使用的任何字段名称。有时,将字段命名为“键”、“顺序”或“值”会很有意义......在引用它们时,所有这些都需要反引号。

【讨论】:

  • 您还应该补充一点,它可以保护您免受任何将来使用的保留字的影响(以前曾被我咬过)。
  • 我实际上曾经有人从我的一个问题中编辑了额外的反引号,这让我很不安,因为这个原因正是我用它们包围每个变量的确切原因
  • 它还允许安全使用非英文标签,仅此一项就足以鼓励使用反引号。
【解决方案4】:

反引号不是标准 ANSI SQL 的一部分。来自the mysql manual

如果 ANSI_QUOTES SQL 模式是 启用,也可以引用 双引号内的标识符

因此,如果您使用反引号,然后决定离开 MySQL,您就会遇到问题(尽管您可能还会遇到更大的问题)

【讨论】:

    【解决方案5】:

    如果您继续使用 MYSQL,没有什么问题,除了查询的视觉模糊性。但它们确实允许使用保留关键字或嵌入空格作为表名和列名。这是大多数数据库引擎的禁忌,并且会阻止以后的任何迁移。

    为了便于阅读,很多人对 SQL 关键字使用大写,例如。

    SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
    

    【讨论】:

      【解决方案6】:

      如果您问我,应该始终使用反引号。但是有一些原因可能会导致团队不愿意使用它们。

      优点:

      • 使用它们,没有保留字或禁止字符。
      • 在某些情况下,您会收到更具描述性的错误消息。
      • 如果您避免了您不在乎的不良做法,但...实际上,有时它们是避免 SQL 注入的好方法。

      缺点:

      • 它们不是标准的,通常不可移植。但是,只要您不使用反引号作为标识符的一部分(这是我能想象到的最糟糕的做法),您就可以通过自动删除反引号来移植您的查询。
      • 如果您的某些查询来自 Access,它们可能会用 " 引用表名(并且您可能无法盲目地删除所有 ")。但是,允许混合使用反引号和双引号。
      • 一些愚蠢的软件或功能会过滤您的查询,并且有反引号问题。但是,它们是 ASCII 的一部分,因此这意味着您的软件/功能非常糟糕。

      【讨论】:

      • 使用反引号与避免 SQL 注入完全无关。
      • @andy 它可能有帮助,因为攻击者必须用另一个反引号将其关闭才能注入。它作用不大,但这仍然是一些事情
      【解决方案7】:

      在您的代码库中搜索反引号内容要容易得多。假设您有一个名为event 的表。 grep -r "event" * 可能会返回数百个结果。 grep -r "\`event\`" * 将返回可能引用您的数据库的任何内容。

      【讨论】:

      • 总的来说,这并不是真正的好处。专业人士遇到的表格名称更像是 new_users_info 而不是“general”。
      【解决方案8】:

      嗯,据我所知,使用反引号的全部目的是让您可以使用与保留关键字一致的名称。因此,如果名称没有与保留关键字冲突,我看不出有任何理由使用反引号。但是,这也不是禁止它们的理由。

      【讨论】:

        【解决方案9】:

        关于反引号的简单事情``用于表示标识符,如database_name,table_name等,单引号'',双引号“” 用于字符串文字,而 "" 用于按原样打印值,而 '' 打印值变量保持,或者在另一种情况下打印他的文本。

        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..
        

        【讨论】:

          【解决方案10】:

          如果您使用某些字段名称作为默认 mysql 或 mssql 值,例如“status”,则必须使用反引号(“select status from table_name”或“select id from table_name where status=1”) . 因为mysql返回错误或查询不工作。

          【讨论】:

            【解决方案11】:

            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分组

            只有当这种情况出现时,使用反引号才有用。建议在所有其他时间使用双引号。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-29
              • 1970-01-01
              • 1970-01-01
              • 2011-07-29
              • 2018-03-04
              相关资源
              最近更新 更多