首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 多字段排序坑點:反引號與單引號的致命差異

     編輯:MySQL 資料庫相關知識

業務場景

產品列表需將特定商品(ifbold=1)沉底展示,其餘按更新時間倒序。SQL 初稿:

SELECT * FROM product_con 
WHERE $scl 
ORDER BY 'ifbold' ASC, $myord DESC 
LIMIT $pagelimit

現象

  • ORDER BY 'ifbold' ASC **完全不生效**,所有行視為同一排序值。
  • 單獨測試 ORDER BY 'ifbold' ASC 也無效。
  • 在 phpMyAdmin 中直接執行卻正常。

根因:字符串字面量 vs 標識符

寫法語義結果
ORDER BY 'ifbold'按**常量字符串** 'ifbold' 排序所有行值相同 → 無排序效果
ORDER BY `ifbold`按**列名** ifbold 排序正常按 0/1 分組排序
ORDER BY "ifbold"同單引號(SQL 模式下視為字符串)無效

修正後 SQL

SELECT * FROM product_con 
WHERE $scl 
ORDER BY `ifbold` ASC, $myord DESC 
LIMIT $pagelimit

最佳實踐:代碼中拼接 SQL 的標識符規範

  1. 統一使用反引號包裹標識符:表名、列名、別名均用 `。
  2. 預處理綁定參數:值參數用 ? 占位符,杜絕拼接注入風險。
  3. ORM/QueryBuilder:如 Laravel Eloquent、ThinkPHP Db::name() 自動處理反引號。
  4. 代碼審查清單:檢查所有 ORDER BY、GROUP BY、WHERE 中的裸列名是否加反引號。

延伸:ANSI_QUOTES 模式下的雙引號

SET SESSION sql_mode = 'ANSI_QUOTES';
SELECT * FROM t ORDER BY "column_name";  -- 雙引號變為標識符
SELECT "literal string";                 -- 字符串必須用單引號

生產環境**不建議開啟 ANSI_QUOTES**,保持反引號為標準識別符,單雙引號專用於字符串,降低認知負擔。

總結

單引號 = 字符串常量,反引號 = 標識符。ORDER BY 'col' 相當於 ORDER BY 'constant',全表視為同一排序鍵。**永遠用反引號包裹列名/表名**,養成肌肉記憶,避免在動態拼接 SQL 時踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved