mysql中的单引号与双引号
mysql中的“”与’'有区别吗
在 MySQL 中,双引号 ""
和单引号 ''
是有区别的,而且它们的用途不同:
✅ 单引号 ''
:用于字符串字面量
这是 标准 SQL 中用来表示字符串的方式。
SELECT 'hello';
-- 结果是字符串 hello
⚠️ 双引号 ""
:用于标识符(如列名、表名)
仅在 ANSI_QUOTES 模式启用时,双引号会被当作 标识符引号,类似于反引号 `
。
例子:
-- 默认情况下(ANSI_QUOTES 未启用):
SELECT "name" FROM users;
-- 这里的 "name" 会被当作字符串 'name',不是列名!-- 如果启用了 ANSI_QUOTES:
SET sql_mode = 'ANSI_QUOTES';
SELECT "name" FROM users;
-- 现在 "name" 被当作列名,等价于 `name`
✅ 反引号 `
:始终用于标识符
无论是否启用 ANSI_QUOTES,反引号都可以用来包裹表名、列名等标识符,防止与关键字冲突。
SELECT `name` FROM `users`;
✅ 总结对比表:
引号类型 | 用途 | 是否依赖 SQL 模式 | 示例 |
---|---|---|---|
'' | 字符串字面量 | 否 | 'hello' |
"" | 字符串字面量 | 默认情况下 | "hello" |
"" | 标识符 | 启用 ANSI_QUOTES | "name" |
` | 标识符 | 否 | `name` |
✅ 建议
- 字符串永远用单引号
''
,这是标准 SQL。 - 标识符用反引号
`
,避免歧义。 - 避免使用双引号
""
,除非你明确启用了 ANSI_QUOTES 并知道它在做什么。
如你还未开启 ANSI_QUOTES,那么 "abc"
就是字符串 'abc'
,不是列名。这常常是 bug 的来源。
标识符是什么
在 MySQL(以及所有 SQL 数据库)里,**标识符(identifier)**就是 你给数据库对象起的“名字”。
换句话说,凡是你在 SQL 语句里用来 指代某个对象 的词,几乎都是标识符。
✅ 常见的标识符举例
对象类型 | 例子 | 备注 |
---|---|---|
数据库名 | my_db | CREATE DATABASE my_db; |
表名 | users 、`order` | 关键字冲突时用反引号 |
列名 | id 、user_name | 同上 |
索引名 | idx_email | CREATE INDEX idx_email … |
视图名 | v_sales | CREATE VIEW v_sales … |
别名 | AS total | SELECT SUM(amount) AS total … |
⚠️ 容易混淆的地方
示例 | 是标识符吗? | 说明 |
---|---|---|
'users' | ❌ 不是 | 这是 字符串字面量,内容是字母 u-s-e-r-s |
`users` | ✅ 是 | 这是 表名 users |
"users" | ✅/❌ 视模式 | 未开 ANSI_QUOTES 时是字符串;开启后是标识符 |
✅ 一句话总结
标识符 = 数据库对象的名字;字符串 = 数据值。
用反引号`
包裹标识符,用单引号'
包裹字符串,就不会踩坑。