使用精確數學時,盡可能使用給定的確切值數字。例如,比較中的數字會完全按照給定的值使用,而不會變更其值。在嚴格 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.24.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 。 |
strict | 無警告,無錯誤;i 被設定為 NULL 。 |
ERROR_FOR_DIVISION_BY_ZERO |
警告,無錯誤;i 被設定為 NULL 。 |
strict,ERROR_FOR_DIVISION_BY_ZERO |
錯誤條件;沒有插入任何列。 |