MySQL:UNSIGNED

MySQL:UNSIGNED

UNSIGNED

UNSIGNED屬性就是將數字型別無符號化,與C、C++這些程式語言中的含義相同。

例如,TINYINT的類型範圍是【-128,127】,TINYINY UNSIGNED的範圍型別就是0~255。

整型範圍

在MySQL中整型範圍:

型別

位元組數

範圍(符號)

範圍(無符號)

說明

TINYINT

1位元組

(-128,127)

(0,255)

極小整數值

SMALLINT

2位元組

(-32768,32767)

(0,65535)

小整數值

MEDIUMINT

3位元組

(-8388608,8388607)

(0,16777215)

中等整數值

INTEGER

4位元組

(-2147483648,2147483647)

(0,4294967295)

整數值

我們在建立表的時候,主鍵一般都是非負整數值,所以用“UNSIGNED”是一個不錯的事情,但是在其他欄位的時候使用“UNSIGNED”就會帶來一些負面的影響,尤其是在做計算的時候,接下來我們以一個小demo來看下效果。

建立表

建立一張表,儲存引擎為InnoDB,欄位a和欄位b都加上了“UNSIGNED”屬性。

CREATE TABLE `test` (`id` bigint(10) UNSIGNED NOT NULL AUTO_INCREMENT, `a` int(4) UNSIGNED NULL, `b` int(4) UNSIGNED NULL, PRIMARY KEY (`id`))

插入值

INSERT INTO `test` (`a`, `b`) VALUES (1, 2)

問題

執行上面的sql語句,向表中插入兩個值,接著執行下面語句,發現報了一個錯誤。

SELECT a-b FROM test

MySQL:UNSIGNED

錯誤提示“BIGINT UNSIGNED”超出了範圍,但是這兩個欄位的型別是TINYINY。

其實這個問題在C語言中“a-b”也會返回一個非常巨大的整型值。這個值是INT UNSIGNED的最大值,即

0xFFFFFFFF

只是0xFFFFFFFF可以代表兩種值:

對於無符號的整型值,其是整型數的最大值,即4294967295;

對於有符號的整型數來說,第一位代表符號位,如果是1,表示是負數,這時應該是取反加1得到負數值,即-1。

如何獲取-1

對SQL_MODE這個引數進行設定即可

,執行如下語句:

SET sql_mode=‘NO_UNSIGNED_SUBTRACTION’;

建議

主鍵可以設定為UNSIGNED。

不需要計算的值可以設定為UNSIGNED。

寫在最後

好兄弟可以點贊並關注我的公眾號“javaAnswer”,全部都是乾貨。