You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置:
    sql_mode = "ANSI_QUOTES,原有其他模式参数"
    
    修改完成后重启MySQL服务即可生效。

需要注意:开启ANSI_QUOTES后,双引号将无法再用来表示字符串常量,此时必须使用单引号'来包裹字符串内容。

内容的提问来源于stack exchange,提问作者flackoverstow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:31