文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man 頁面 (TGZ) - 258.5Kb
Man 頁面 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  表達式處理

14.24.3 表達式處理

使用精確數學時,盡可能使用給定的確切值數字。例如,比較中的數字會完全按照給定的值使用,而不會變更其值。在嚴格 SQL 模式中,對於使用精確資料類型 (DECIMAL 或整數) 的資料行執行 INSERT 時,如果數字在資料行範圍內,則會以其確切值插入。擷取時,該值應與插入的值相同。(如果未啟用嚴格 SQL 模式,則允許針對 INSERT 進行截斷。)

數值表達式的處理取決於表達式包含的值類型

  • 如果存在任何近似值,則表達式為近似值,並使用浮點運算進行評估。

  • 如果不存在近似值,則表達式僅包含確切值。如果任何確切值包含小數部分(小數點後的值),則表達式會使用 DECIMAL 精確算術進行評估,並具有 65 位數的精確度。術語確切受到二進位表示法的限制。例如,1.0/3.0 在十進位表示法中可近似為 .333...,但無法寫成確切的數字,因此 (1.0/3.0)*3.0 的評估結果不會完全等於 1.0

  • 否則,表達式僅包含整數值。表達式是確切的,並使用整數算術進行評估,並且具有與 BIGINT (64 位元) 相同的精確度。

如果數值表達式包含任何字串,則會將其轉換為雙精確度浮點值,並且該表達式是近似值。

將值插入數值資料行的作業會受到 SQL 模式的影響,該模式由 sql_mode 系統變數控制。(請參閱 第 7.1.11 節「伺服器 SQL 模式」。)以下討論提及嚴格模式(由 STRICT_ALL_TABLESSTRICT_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 錯誤條件;沒有插入任何列。