在 MySQL 中進行整數減法運算時,若參與運算的任一操作數為 UNSIGNED 類型,結果將被視為無符號數。當結果為負數時,不同版本表現不同:
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range,阻斷錯誤數據入庫。-- 以下語句均會報錯
SELECT (CAST(0 AS UNSIGNED) - 1);
SELECT (1 - CAST(2 AS UNSIGNED));
-- 正數結果正常
SELECT (1 - CAST(0 AS UNSIGNED)); -- 返回 1
將任一操作數強制轉為有符號類型,運算即在有符號域進行,負數結果合法返回:
SELECT (1 - CAST(2 AS SIGNED)); -- 返回 -1
若計算結果需寫入 UNSIGNED 字段,不應強轉類型掩蓋邏輯錯誤,而應在應用層捕獲異常並報警,排查業務邏輯(如扣款超額、庫存扣減異常等)。
SIGNED 類型;CAST(... AS SIGNED) 明確語義;從 5.5.5 以下版本升級時,原本靜默截斷的語句將開始報錯,建議提前掃描應用代碼中的減法運算,逐一評估兼容性。