MySQL中的引号:单引号、双引号和反引号——全面解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么MySQL中的引号让人抓狂?

\n\n

如果你曾经用PHP编写过SQL查询,你肯定遇到过困惑:什么时候用单引号(' '),什么时候用双引号(" "),什么时候用那些神秘的反引号(` `)?一个符号的错误——你得到的不是数据,而是MySQL语法错误,或者更糟糕的是,一个安全漏洞。

\n\n

这个话题是Stack Overflow上最热门的问题之一(浏览量超过200万!)。这并非没有原因。即使是经验丰富的开发人员有时也会混淆。今天,我们将一劳永逸地厘清所有问题。你将了解到:

\n\n
    \n
  • MySQL中每种引号类型的作用
  • \n
  • 如何在PHP中正确转义数据
  • \n
  • 为什么双引号是邪恶的(几乎总是)
  • \n
  • 如何防范SQL注入
  • \n
\n\n

开始吧!🚀

\n\n

MySQL查询剖析:三种引号类型

\n\n

在MySQL中,有三种不同的符号看起来像引号,但它们执行完全不同的任务:

\n\n

1. 单引号(' ')——用于字符串值

\n\n

何时使用: 当你传递一个字符串(文本、日期、电子邮件、密码)时始终使用。

\n\n
SELECT * FROM users WHERE name = '伊万';\nINSERT INTO articles (title) VALUES ('MySQL入门指南');
\n\n

MySQL将单引号内的所有内容视为字符串字面量。这意味着你在告诉数据库:“这里是我的值,不要试图将其解释为列名或命令”。

\n\n

2. 双引号(" ")——几乎相同,但有细微差别

\n\n

在标准SQL中,双引号用于标识符(表名和列名)。但MySQL默认在一种模式下运行,其中双引号等同于单引号。这常常令人困惑。

\n\n
-- 这样可行,但最好别这么做\nSELECT * FROM users WHERE name = "玛丽亚";
\n\n

问题: 如果你启用了严格模式ANSI_QUOTES,双引号将开始像反引号一样工作。你的代码会崩溃。因此:

\n\n

规则#1: 始终使用单引号表示字符串。双引号——只有当你确切知道自己在做什么,或者为了与其他DBMS兼容时才使用。

\n\n

3. 反引号(` `)——用于表名和列名

\n\n

反引号是标识符。它们用于:

\n\n
    \n
  • 使用保留字作为名称(不良实践,但确实存在)
  • \n
  • 处理包含空格或特殊字符的名称
  • \n
  • 避免与MySQL关键字冲突
  • \n
\n\n
-- 不好:'select' 是保留字\nSELECT * FROM select;\n\n-- 好:用反引号转义\nSELECT * FROM `select`;\n\n-- 必须:名称包含空格\nSELECT `user name` FROM users;\n\n-- 推荐:始终转义表名和列名\nSELECT `id`, `name` FROM `users` WHERE `status` = 'active';
\n\n

重要: 反引号不能用于值。这会导致错误。

\n\n
-- 错误:MySQL会认为'伊万'是列名\nSELECT * FROM users WHERE name = `伊万`;
\n\n

PHP + MySQL:如何避免引号混淆

\n\n

现在最有趣的部分——这一切在PHP中如何工作。PHP本身对字符串使用单引号和双引号,这里很容易出错。

\n\n

情况#1:直接插入变量(危险!)

\n\n
// 不好:容易受到SQL注入攻击\n$name = "伊万'; DROP TABLE users; --";\n$query = "SELECT * FROM users WHERE name = '$name'";\n// 结果:SELECT * FROM users WHERE name = '伊万'; DROP TABLE users; --'
\n\n

这是经典的SQL注入。永远不要这样做!

\n\n

情况#2:通过mysqli_real_escape_string转义(更好,但不完美)

\n\n

博客

书籍推荐