【问题标题】:Type of apostrophe in mysql/phpmysql/php 中的撇号类型
【发布时间】:2013-11-25 17:48:03
【问题描述】:

我在 mysql 中遇到了这个查询示例:

SELECT `id`, `food`, `calories`, `healthy_unhealthy` FROM `food` WHERE 1  //works

将其输入 Codelobster,结果如下:

$query = "SELECT 'id', 'food', 'calories', 'healthy_unhealthy' FROM 'food'"; //fails

撇号不同。它失败了:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在行的“食物”附近使用

如果我把那个有效的放到 $query 中,它就有效。

$query = "SELECT `id`, `food`, `calories`, `healthy_unhealthy` FROM `food`"; //works

如果在 php 编辑器上这样做,撇号不起作用,因为它是不同的。仅此更改就无法正常工作。是否有可以用于该样式的键或 php 编辑器中的设置?

【问题讨论】:

  • 什么,应该是`,而不是`。您正在使用刻度线来防止与 MySQL 保留字发生冲突(我相信它的一般良好做法)。

标签: php mysql apostrophe


【解决方案1】:

反引号是 mysql 语法,用于包装表名和表以明确标识它们。常规单引号用于普通字符串分隔符。区别是例如

`id`

同时引用一列

'id'

只是一个字符串。或者,您可以对列或表名使用 NO 反引号,只要它们不是 mysql 保留字(无论如何您都不应该这样做)

例如,如果您在名为 bar 的表中有一个名为 foo 的列,您可以这样做

$sql = "select `foo` from `bar`"; 

$sql = "select foo from bar";

但是,例如,如果您有一个名为 count 的列,那么您必须将其包装在反引号中,因为 count 是 mysql 中的保留字:

$sql = "select `count` from bar"; 

..但如前所述,无论如何您都不应该将列或表命名为保留字。这是不好的做法。虽然如果你用反引号括起来 mysql 允许这样做,但并非所有数据库都支持这一点,所以它会使你的查询不那么可移植。

【讨论】:

  • 我在谷歌搜索时偶然发现了这个问题,同时看到了你的答案。关于“但是,例如,如果您有一个名为count 的列,那么您必须将其包装在反引号中,因为count 是mysql 中的保留字:” - count 不是@ 987654321@ 但aggregate function。以防万一其他人访问此页面并且没有得到错误的印象;)但是,手册确实指出使用它时需要小心。
【解决方案2】:

` 被称为反引号,它们使它们之间的任何解释都按字面解释 100%。这实际上可以让您将具有句法含义的字符实际用作表名或数据库名(除其他外)。尽管在表名等中使用具有语法意义的字符是不好的做法,但自动化程序必须考虑到这一点,因此将所有表名和列名等括在反引号中。

【讨论】:

    【解决方案3】:

    反引号用于转义 MySQL 中的保留字,例如如果你的表中有一个名为 select 的字段,那么

    SELECT select
    FROM ...
    

    这将是一个语法错误,因为 MySQL 无法分辨什么是字段以及 SQL“脚手架”的一部分。但如果你使用反引号:

    SELECT `select`
    FROM ...
    

    然后它告诉 MySQl select 是一个字段(或表名)并且不被视为 sql 关键字。

    使用单个 ' 引号,您可以将内容变成一个字符串:

    SELECT 'select'
    FROM ...
    

    现在'select' 是这样的,您正在选择包含字母sel 等的文字字符串...它被视为字符串,而不是一个 sql 关键字,或一个字段/表名。

    意思是

    SELECT ...
    FROM 'food'
    

    失败,因为您试图从文字字符串中进行选择。它不是表名,也不能从中选择。

    【讨论】:

      【解决方案4】:

      该键取决于您的键盘布局,但通常是重音符 (`)。

      More information here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多