MySQL 在遵循 ANSI SQL-92 / SQL:1999 核心特性的同時,引入大量實用擴展以提升開發效率與運行性能。本文系統梳理 MySQL 非標準擴展、與標準 SQL 的行為差異、缺失功能及兼容性移植最佳實踐,幫助開發者在「利用擴展提效」與「保持跨庫可移植」之間做出平衡決策。
TINYINT、SMALLINT、MEDIUMINT、BIGINT(標準僅定義 SMALLINT/INTEGER/BIGINT)ENUM、SET、多長度 BLOB/TEXT(TINY/BLOB/MEDIUM/LONG)AUTO_INCREMENT、BINARY、UNSIGNED、ZEROFILL默認 不區分大小寫,按字符集排序規則(默認 latin1_swedish_ci)。需區分大小寫時:列定義加 BINARY 屬性,或查詢中用 BINARY col 強制按字節序比較。
.frm、.MYD、.MYI 或 .ibd)cp/mv/rm)直接備份/重命名/移動表文件。`、雙引號 "(ANSI 模式下)、單引號 ' 包裹字符串字面值db_name.tbl_name 直接訪問其他庫表,類似「用戶空間」概念。不支持表空間(TABLESPACE 子句)。
SELECT ... INTO OUTFILE、STRAIGHT_JOIN 強制聯結順序SQL_SMALL_RESULT 提示優化器結果集較小EXPLAIN SELECT 獲取執行計劃CREATE TABLE 內聯索引定義、列前綴索引、INDEX/KEY 同義CREATE TEMPORARY TABLE、IF NOT EXISTSCOUNT(DISTINCT expr1, expr2, ...) 多列去重計數ALTER TABLE 支持 CHANGE/DROP COLUMN/DROP INDEX、IGNORE 忽略重複鍵錯誤、單語句多 ADD/ALTER/DROP/CHANGE 子句DROP TABLE IF EXISTS、單語句多表 DROP TABLE t1, t2DELETE ... LIMIT n、INSERT/REPLACE ... DELAYED、INSERT/REPLACE/DELETE/UPDATE ... LOW_PRIORITYLOAD DATA INFILE(與 Oracle 兼容)、OPTIMIZE TABLESHOW 系列元數據查詢命令SET OPTION 會話級參數調整GROUP BY 可省略選擇列(僅用於特定聚合優化場景)||、&& 作為邏輯 OR/AND(C 風格),不支持 ANSI || 字符串拼接 → 用 CONCAT()% 為 MOD() 同義詞(兼容 C/PostgreSQL)=、<>、<=、<、>=、>、<<、>>、<=>、AND、OR、LIKE)可用於 SELECT 列表投影,返回布爾值(0/1)LAST_INSERT_ID() 獲取自增值REGEXP / NOT REGEXP 正則匹配CONCAT()、CHAR() 支持任意參數個數BIT_COUNT()、CASE、ELT()、FROM_DAYS()、FORMAT()、IF()、PASSWORD()、ENCRYPT()、MD5()、ENCODE()/DECODE()、PERIOD_ADD/DIFF()、TO_DAYS()、WEEKDAY() 等TRIM() 支持多字符修剪(ANSI 僅單字符)STD()、BIT_OR()、BIT_AND()REPLACE INTO(語義等同 DELETE + INSERT)FLUSH flush_option 運行時刷新操作SELECT @a:=SUM(x), @b:=COUNT(*) ...CREATE DATABASE / DROP DATABASEmysqld --ansi)| 項目 | 默認模式 | ANSI 模式 |
|---|---|---|
|| | 邏輯 OR | 字符串拼接 |
函數名與 ( 間空格 | 不允許 | 允許(函數名成為保留字) |
" | 字符串界定符 | 標識符界定符(同 `) |
REAL | DOUBLE 同義詞 | FLOAT 同義詞 |
-- 後必須跟空白字符;標準允許 -- 直接結尾REVOKE不支持 IN/NOT IN (SELECT ...)、EXISTS (SELECT ...)、標量子查詢。
替代方案:
INNER JOIN / LEFT JOIN ... IS NULLDELETE 需聯結時:應用層分兩步(先 SELECT 主鍵 → 再 DELETE ... IN (...))或用 CONCAT() 動態生成批量 DELETE 腳本管道輸入 mysql 客戶端獨立子查詢預計 3.24 版本引入,當前僅支持 INSERT ... SELECT、REPLACE ... SELECT。
不支持 Oracle 擴展語法。替代:INSERT INTO ... SELECT(ANSI 標準)、SELECT ... INTO OUTFILE、CREATE TABLE ... SELECT。
不支持標準事務(BEGIN/COMMIT/ROLLBACK)。短期規劃提供 原子操作(無回滾的事務):LOCK TABLES/UNLOCK TABLES 實現串行化隔離。
尚未實現。存儲過程可減少網絡往返、解析開銷,提升性能與封裝層次。
利用 /*! MySQL專用代碼 */ 或 /*!版本號 代碼 */,其他數據庫視為普通註釋忽略:
SELECT /*! STRAIGHT_JOIN */ col FROM t1, t2 WHERE ...;
CREATE /*!32302 TEMPORARY */ TABLE t (a INT); -- 3.23.02+ 才啟用 TEMPORARY
CONCAT()LIKE,避免 CLIKE 等專有語法AUTO_INCREMENT、ENUM、SET 等專有類型於核心領域模型MySQL 的擴展多針對 Web 應用高頻場景(分頁、批量導入、靈活類型、高性能查詢提示),合理使用可顯著提升開發效率與運行性能。採用條件編譯註釋、標準函數別名、顯式括號等技巧,可在享受擴展紅利的同時最大程度保持跨數據庫可移植性。對於事務、子查詢、存儲過程等缺失標準功能,可通過應用層模式或升級版本逐步彌補。