萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 與 SQL 標準兼容性差異全景圖:遷移與移植必讀

MySQL 專有擴展語法

MySQL 為了易用性與效能,引入大量非標準語法。開發可移植應用時,請善用條件註釋 /*! ... */ 或版本註釋 /*!32302 ... */ 封裝專有語法,其他資料庫會忽略。

資料類型擴展

  • 整數:TINYINT、SMALLINT、MEDIUMINT、BIGINT(標準僅 SMALLINT、INTEGER、BIGINT)。
  • 字串:SET、ENUM、多種 BLOB/TEXT 亞型(TINYBLOB、MEDIUMBLOB、LONGBLOB)。
  • 屬性:AUTO_INCREMENT、UNSIGNED、ZEROFILL、BINARY。

字元集與排序規則

  • 預設不區分大小寫比較(依 latin1_swedish_ci),標準要求區分大小寫。
  • 需區分大小寫時,宣告欄位加 BINARY 屬性或使用 COLLATE utf8mb4_bin。

識別命名規則

  • 資料庫/表名對應檔案系統目錄/檔名,Linux 下區分大小寫,Windows 下不區分。建議統一小寫命名。
  • 識別符可數字開頭(但不可純數字),標準不允許。
  • 支援雙引號 " 包裹字串(ANSI 模式下雙引號為識別符引號)。
  • 反引號 ` 為 MySQL 專屬識別符引號。

SQL 語句擴展

功能MySQL 語法標準/其他資料庫
備份/匯出SELECT ... INTO OUTFILE標準無,Oracle 用 UTL_FILE、PostgreSQL 用 COPY TO
聯結控制STRAIGHT_JOIN、SQL_SMALL_RESULT標準無 Hint 機制
執行計劃EXPLAIN SELECT標準無,各資料庫自有命令
建表選項TEMPORARY、IF NOT EXISTS、INDEX/KEY 列內建、前綴索引部分標準支援 TEMPORARY
聚合函數COUNT(DISTINCT col1, col2) 多列去重標準僅單列
ALTER TABLE多 ADD/DROP/CHANGE 子句合併、IGNORE 忽略重複鍵錯誤標準單子句
刪除限制DELETE ... LIMIT n標準無 LIMIT
插入變體INSERT DELAYED、LOW_PRIORITY、REPLACE、INSERT IGNORE標準 MERGE (UPSERT)
載入資料LOAD DATA INFILEOracle 相容,SQL Server 用 BULK INSERT
維護命令OPTIMIZE TABLE、ANALYZE TABLE、CHECK TABLE、REPAIR TABLE各資料庫自有工具
資訊查詢SHOW DATABASES/TABLES/COLUMNS/INDEX/STATUS/VARIABLES/PROCESSLIST/GRANTS/ENGINES/ERRORS/WARNINGS標準查詢 INFORMATION_SCHEMA
變數賦值SELECT @a:=1, @b:=@a+2、SET @var=value標準無使用者變數
運算子|| 為邏輯 OR(非字串連接)、&& 為 AND、<=> 安全等於(NULL 安全)標準 || 字串連接,IS NOT DISTINCT FROM
函數庫MD5()、PASSWORD()、ENCRYPT()、ENCODE/DECODE、AES_ENCRYPT/DECRYPT、BIT_COUNT、IF()、IFNULL()、COALESCE()、GREATEST/LEAST、PERIOD_ADD/DIFF、TRIM() 多字元修剪、STD/BIT_OR/BIT_AND 聚合各資料庫函數差異極大

ANSI 模式啟動差異

啟動參數 --ansi 或 SET sql_mode='ANSI' 會改變:

  • || 變為字串連接(標準行為)。
  • 函數名與括號間允許空白,所有函數名成為保留字。
  • " 變為識別符引號(同 `)。
  • REAL 同義 FLOAT(預設同義 DOUBLE)。

與 ANSI SQL:1992 主要差異

  • -- 註釋需後接空白字元(標準不要求)。
  • VARCHAR 儲存時截斷尾部空格(標準保留)。
  • CHAR 隱式轉為 VARCHAR(特定條件下)。
  • DROP TABLE 不自動撤銷該表權限,需顯式 REVOKE。
  • 缺少:子查詢(舊版)、CHECK 約束(8.0.16+ 支援)、FULL OUTER JOIN、MERGE、窗口函數(8.0+ 支援)、共用資料表運算式 WITH(8.0+ 支援)。

遷移建議

  1. 使用 mysqldump --compatible=postgresql|oracle|mssql 產生相容腳本。
  2. 應用層封裝資料庫抽象層(如 Hibernate、JPA、SQLAlchemy),吸收方言差異。
  3. 嚴格測試:資料類型映射、隱式轉換、NULL 語義、排序規則、鎖行為、交易隔離級別。
copyright © 萬盛學電腦網 all rights reserved