MySQL 8.0.28中ORDER BY子句双引号字段为何未按预期排序?
MySQL 8.0.28中ORDER BY子句的双引号与反引号行为差异
未正确排序的查询执行情况
执行以下SQL语句:
SELECT 2 as "A A" UNION ALL SELECT 1 ORDER BY "A A"
得到的结果为:
| A A |
|---|
| 2 |
| 1 |
正确排序的查询执行情况
执行以下SQL语句:
SELECT 2 as "A A" UNION ALL SELECT 1 ORDER BY `A A`
得到预期的排序结果:
| A A |
|---|
| 1 |
| 2 |
问题与解答
核心问题
这是否意味着MySQL在ORDER BY子句中将双引号包裹的"A A"识别为常量字符串而非字段名?能否通过配置修改该行为?
解答
是的,你观察到的现象完全正确:在默认配置下,MySQL 8.0.28的ORDER BY子句中,双引号包裹的"A A"会被当作常量字符串处理,而非指代别名是A A的字段。因为这个常量字符串对每一行的取值都相同,排序时不会改变原结果集的顺序,因此出现了未排序的输出。
而反引号`是MySQL用来包裹标识符(字段名、别名等)的标准符号,用它包裹A A时,MySQL会正确识别这是要按该字段的数值进行排序,因此得到了预期的升序结果。
关于配置修改:可以通过调整MySQL的sql_mode参数来改变双引号的行为。当在sql_mode中添加ANSI_QUOTES选项后,双引号会被当作标识符的包裹符号,功能和反引号完全一致。
修改方式分为两种:
- 临时生效(仅当前会话):执行以下SQL命令
SET sql_mode = CONCAT(@@sql_mode, ',ANSI_QUOTES'); - 永久生效:修改MySQL的配置文件(如Linux下的
my.cnf、Windows下的my.ini),在[mysqld]段落中添加或修改sql_mode配置:
修改完成后重启MySQL服务即可生效。sql_mode = "ANSI_QUOTES,原有其他模式参数"
需要注意:开启ANSI_QUOTES后,双引号将无法再用来表示字符串常量,此时必须使用单引号'来包裹字符串内容。
内容的提问来源于stack exchange,提问作者flackoverstow
相关产品推荐
相关产品推荐

