文件首頁
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 參考手冊  /  ...  /  數值資料類型語法

13.1.1 數值資料類型語法

對於整數資料類型,M 表示最小顯示寬度。最大顯示寬度為 255。顯示寬度與類型可以儲存的值的範圍無關,如第 13.1.6 節「數值類型屬性」中所述。

對於浮點和定點資料類型,M是可以儲存的總位數。

顯示寬度屬性對於整數資料類型已棄用;您應該預期在 MySQL 的未來版本中會移除對它的支援。

如果您為數值欄位指定 ZEROFILL,MySQL 會自動將 UNSIGNED 屬性新增至該欄位。

ZEROFILL 屬性對於數值資料類型已棄用;您應該預期在 MySQL 的未來版本中會移除對它的支援。請考慮使用替代方法來產生此屬性的效果。例如,應用程式可以使用LPAD()函數將數字補零到所需的寬度,或者將格式化後的數字儲存在CHAR欄位中。

允許 UNSIGNED 屬性的數值資料類型也允許 SIGNED。但是,這些資料類型預設為帶正負號,因此 SIGNED 屬性沒有任何效果。

UNSIGNED 屬性對於 FLOATDOUBLEDECIMAL(以及任何同義詞)類型的欄位已棄用;您應該預期在 MySQL 的未來版本中會移除對它的支援。請考慮改為對此類欄位使用簡單的 CHECK 約束。

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的別名。

整數欄位定義中的 SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE 的別名。

警告

當您在整數值之間使用減法運算時,如果其中一個值的類型為 UNSIGNED,除非啟用了 NO_UNSIGNED_SUBTRACTION SQL 模式,否則結果將為不帶正負號。請參閱第 14.10 節「轉換函數和運算子」

  • BIT[(M)]

    位元值類型。M 表示每個值的位元數,從 1 到 64。如果省略 M,則預設值為 1。

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

    非常小的整數。帶正負號的範圍為 -128127。不帶正負號的範圍為 0255

  • BOOLBOOLEAN

    這些類型是 TINYINT(1) 的同義詞。值為零被視為 false。非零值被視為 true

    mysql> SELECT IF(0, 'true', 'false');
    +------------------------+
    | IF(0, 'true', 'false') |
    +------------------------+
    | false                  |
    +------------------------+
    
    mysql> SELECT IF(1, 'true', 'false');
    +------------------------+
    | IF(1, 'true', 'false') |
    +------------------------+
    | true                   |
    +------------------------+
    
    mysql> SELECT IF(2, 'true', 'false');
    +------------------------+
    | IF(2, 'true', 'false') |
    +------------------------+
    | true                   |
    +------------------------+

    但是,值 TRUEFALSE 僅僅分別是 10 的別名,如下所示

    mysql> SELECT IF(0 = FALSE, 'true', 'false');
    +--------------------------------+
    | IF(0 = FALSE, 'true', 'false') |
    +--------------------------------+
    | true                           |
    +--------------------------------+
    
    mysql> SELECT IF(1 = TRUE, 'true', 'false');
    +-------------------------------+
    | IF(1 = TRUE, 'true', 'false') |
    +-------------------------------+
    | true                          |
    +-------------------------------+
    
    mysql> SELECT IF(2 = TRUE, 'true', 'false');
    +-------------------------------+
    | IF(2 = TRUE, 'true', 'false') |
    +-------------------------------+
    | false                         |
    +-------------------------------+
    
    mysql> SELECT IF(2 = FALSE, 'true', 'false');
    +--------------------------------+
    | IF(2 = FALSE, 'true', 'false') |
    +--------------------------------+
    | false                          |
    +--------------------------------+

    最後兩個陳述式顯示的結果如所示,因為 2 不等於 10

  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

    小型整數。帶正負號的範圍為 -3276832767。不帶正負號的範圍為 065535

  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

    中型整數。帶正負號的範圍為 -83886088388607。不帶正負號的範圍為 016777215

  • INT[(M)] [UNSIGNED] [ZEROFILL]

    普通大小的整數。帶正負號的範圍為 -21474836482147483647。不帶正負號的範圍為 04294967295

  • INTEGER[(M)] [UNSIGNED] [ZEROFILL]

    此類型是 INT 的同義詞。

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

    一個大型整數。帶符號的範圍是 -92233720368547758089223372036854775807。無符號的範圍是 018446744073709551615

    SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的別名。

    關於 BIGINT 欄位,您應該注意以下幾點

    • 所有算術運算都是使用帶符號的 BIGINTDOUBLE 值進行的,因此您不應使用大於 9223372036854775807(63 位元)的無符號大整數,除非使用位元函數!如果您這樣做,結果中的某些最後一位數字可能會因為將 BIGINT 值轉換為 DOUBLE 時的四捨五入錯誤而錯誤。

      MySQL 可以在以下情況下處理 BIGINT

      • 當使用整數在 BIGINT 欄位中儲存大型無符號值時。

      • MIN(col_name)MAX(col_name) 中,其中 col_name 指的是 BIGINT 欄位。

      • 當使用運算子(+-* 等),且兩個運算元都是整數時。

    • 您始終可以透過使用字串儲存的方式,在 BIGINT 欄位中儲存精確的整數值。在這種情況下,MySQL 會執行字串到數字的轉換,而不會涉及中間的雙精度表示。

    • 當兩個運算元都是整數值時,-+* 運算子會使用 BIGINT 算術。這表示當結果大於 9223372036854775807 時,如果您將兩個大整數(或從返回整數的函數獲得的結果)相乘,可能會得到意外的結果。

  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

    一個封裝的「“精確”」定點數字。M 是總位數(精度),而 D 是小數點後的位數(比例)。小數點和(對於負數)的 - 符號不計入 M 中。如果 D 為 0,則值沒有小數點或小數部分。 DECIMAL 的最大位數 (M) 為 65。支援的最大小數位數 (D) 為 30。如果省略 D,則預設值為 0。如果省略 M,則預設值為 10。(對於 DECIMAL 字面文字的文字長度也有一個限制;請參閱 第 14.25.3 節,「表達式處理」。)

    如果指定 UNSIGNED,則不允許負值。 UNSIGNED 屬性已針對 DECIMAL 類型的欄位(以及任何同義詞)被棄用;您應該預期 MySQL 的未來版本會將其移除。請考慮改為對此類欄位使用簡單的 CHECK 約束。

    使用 DECIMAL 欄位的所有基本計算(+、-、*、/)都以 65 位數的精度完成。

  • DEC[(M[,D])] [UNSIGNED] [ZEROFILL]NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]

    這些類型是 DECIMAL 的同義詞。 FIXED 同義詞可用於與其他資料庫系統相容。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    一個小的(單精度)浮點數。允許的值為 -3.402823466E+38-1.175494351E-380 以及 1.175494351E-383.402823466E+38。這些是基於 IEEE 標準的理論限制。實際範圍可能會根據您的硬體或作業系統略小。

    M 是總位數,而 D 是小數點後的位數。如果省略 MD,則值會儲存到硬體允許的限制。單精度浮點數的精確度約為小數點後 7 位。

    FLOAT(M,D) 是非標準的 MySQL 擴展。此語法已棄用,您應該預期 MySQL 的未來版本會將其移除。

    如果指定 UNSIGNED,則不允許負值。 UNSIGNED 屬性已針對 FLOAT 類型的欄位(以及任何同義詞)被棄用,您應該預期 MySQL 的未來版本會將其移除。請考慮改為對此類欄位使用簡單的 CHECK 約束。

    使用 FLOAT 可能會給您帶來一些意想不到的問題,因為 MySQL 中的所有計算都是以雙精度完成的。請參閱 第 B.3.4.7 節,「解決沒有符合條件的資料列的問題」

  • FLOAT(p) [UNSIGNED] [ZEROFILL]

    一個浮點數。p 代表以位元為單位的精度,但 MySQL 僅使用此值來判斷是否對產生的資料類型使用 FLOATDOUBLE。如果 p 在 0 到 24 之間,則資料類型會變成沒有 MD 值的 FLOAT。如果 p 在 25 到 53 之間,則資料類型會變成沒有 MD 值的 DOUBLE。產生的欄位的範圍與本節前面描述的單精度 FLOAT 或雙精度 DOUBLE 資料類型相同。

    如果指定 UNSIGNED,則不允許負值。 UNSIGNED 屬性已針對 FLOAT 類型的欄位(以及任何同義詞)被棄用,您應該預期 MySQL 的未來版本會將其移除。請考慮改為對此類欄位使用簡單的 CHECK 約束。

    提供 FLOAT(p) 語法是為了與 ODBC 相容。

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    一個標準大小(雙精度)的浮點數。允許的值為 -1.7976931348623157E+308-2.2250738585072014E-3080,以及 2.2250738585072014E-3081.7976931348623157E+308。這些是基於 IEEE 標準的理論極限。實際範圍可能因您的硬體或作業系統而略小。

    M 是總位數,而 D 是小數點後的位數。如果省略 MD,則數值會儲存到硬體允許的極限。雙精度浮點數的精確度約為 15 個十進位數。

    DOUBLE(M,D) 是一個非標準的 MySQL 擴展;且已棄用。您應該預期在未來版本的 MySQL 中會移除對此語法的支援。

    如果指定 UNSIGNED,則不允許負值。對於 DOUBLE 類型(以及任何同義詞)的列,UNSIGNED 屬性已被棄用,您應該預期在未來版本的 MySQL 中會移除對它的支援。對於此類列,請考慮改用簡單的 CHECK 約束。

  • DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

    這些類型是 DOUBLE 的同義詞。例外情況:如果啟用 REAL_AS_FLOAT SQL 模式,則 REALFLOAT 的同義詞,而不是 DOUBLE