文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

14.25.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.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 錯誤狀況;未插入任何列。