使用精確數學時,會盡可能使用給定的確切數值。例如,比較中的數值會以給定的確切數值使用,而不會變更其值。在嚴格 SQL 模式中,對於使用精確資料類型 (DECIMAL
或整數) 的資料行 INSERT
,如果數值在資料行範圍內,則會插入其確切值。擷取時,該值應與插入的值相同。(如果未啟用嚴格 SQL 模式,則允許 INSERT
的截斷。)
數值表達式的處理方式取決於表達式包含的值類型
如果數值表達式包含任何字串,則會將其轉換為雙精度浮點數值,並且表達式是近似的。
將數值插入數值資料行會受到 SQL 模式的影響,該模式由 sql_mode
系統變數控制。(請參閱第 7.1.11 節〈伺服器 SQL 模式〉。)以下討論提及嚴格模式(由 STRICT_ALL_TABLES
或 STRICT_TRANS_TABLES
模式值選取)和 ERROR_FOR_DIVISION_BY_ZERO
。若要開啟所有限制,您可以簡單地使用 TRADITIONAL
模式,其中包括嚴格模式值和 ERROR_FOR_DIVISION_BY_ZERO
。
SET sql_mode='TRADITIONAL';
如果將數值插入精確類型資料行 (DECIMAL
或整數),如果數值在資料行範圍和精度內,則會插入其確切值。
如果值的小數部分位數過多,則會發生捨入並產生注意事項。捨入如第 14.25.4 節〈捨入行為〉中所述執行。即使在嚴格模式下,由於捨入小數部分而造成的截斷也不是錯誤。
如果值在整數部分有過多位數,則它太大 (超出範圍),並按如下方式處理
如果未啟用嚴格模式,則會將該值截斷為最接近的合法值並產生警告。
如果啟用嚴格模式,則會發生溢位錯誤。
不會偵測到下溢,因此下溢處理是未定義的。
對於將字串插入數值資料行,如果字串具有非數值內容,則從字串到數值的轉換會按如下方式處理
不以數值開頭的字串不能用作數值,並且在嚴格模式下會產生錯誤,否則會產生警告。這包括空字串。
可以轉換以數值開頭的字串,但會截斷尾隨的非數值部分。如果截斷的部分包含空格以外的任何內容,則在嚴格模式下會產生錯誤,否則會產生警告。
預設情況下,除以零會產生 NULL
的結果,且不會發出警告。透過適當設定 SQL 模式,可以限制除以零。
啟用 ERROR_FOR_DIVISION_BY_ZERO
SQL 模式後,MySQL 會以不同方式處理除以零
如果未啟用嚴格模式,則會發生警告。
如果啟用嚴格模式,則禁止插入和更新涉及除以零的動作,並且會發生錯誤。
換句話說,插入和更新涉及執行除以零的表達式可以視為錯誤,但除了嚴格模式之外,還需要 ERROR_FOR_DIVISION_BY_ZERO
。
假設我們有以下陳述式
INSERT INTO t SET i = 1/0;
以下是在嚴格模式和 ERROR_FOR_DIVISION_BY_ZERO
模式組合下發生的情況。
sql_mode 值 |
結果 |
---|---|
'' (預設) |
無警告、無錯誤;i 設定為 NULL 。 |
嚴格模式 | 無警告、無錯誤;i 設定為 NULL 。 |
ERROR_FOR_DIVISION_BY_ZERO |
警告、無錯誤;i 設定為 NULL 。 |
嚴格模式、ERROR_FOR_DIVISION_BY_ZERO |
錯誤狀況;未插入任何列。 |