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
錯誤提示“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”,全部都是乾貨。