這裡是使用了unsigned 的 smallint 字段類型在更新時提示 65535錯誤了,這個意思是長度在65535之外了,也就是會出現補數溢出的情況了,下面本文章來給各位介紹解決辦法。
$sql = "UPDATE `dzxbbs_common_member` SET newprompt=newprompt-1 WHERE uid='{$uid}'";
`dzxbbs_common_member` 表中 newprompt的類型是 smallint unsigned 長度為6的類型。
當newprompt值為0時,執行這條sql語句,得到了意想不到的結果newprompt字段值變成了65535。
出現這個問題的服務器版本是 mysql 5.1.38-log。
解決這個需要設置這個參數 sql_mode="NO_UNSIGNED_SUBTRACTION" 啟用這個選項後兩個UNSIGNED類型相減返回SIGNED類型。
我在本地測試的結果是報錯
#1690 – BIGINT UNSIGNED value is out of range in '(`test`.`test`.`view` – 1)'
服務器版本: mysql 5.5.16
開源電商系統ecshop商品庫存也存在突然變成65535的問題
補充:unsigned相關字段長度
unsigned 既為非負數,用此類型可以增加數據長度!
例如如果 tinyint最大是127,那 tinyint unsigned 最大 就可以到 127 * 2
unsigned 屬性只針對整型,而binary屬性只用於char 和varchar。
類型
說明
tinyint
非常小
的整數
smallint
較小整數
mediumint
中等大小整數
int
標准整數
bigint
較大整數
float
單精度浮點數
double
雙精度浮點數
decimal
一個串
的浮點數
每種數值
類型的名稱和取值范圍如表2所示。
類型說明
取值范圍
tinyint[(m)]
有符號值:-128 到127(- 27 到27 - 1)
無符號值:0到255(0 到28 - 1)
1個字節
smallint[(m)]
有符號值:-32768 到32767(- 215 到215 - 1)
無符號值:0到
65535(0 到21 6 - 1)
2個字節
mediumint[(m)]
有符號值:-8388608 到8388607(- 22 3 到22 3 - 1 )
無符號值:0到16777215(0 到22 4 - 1)
3個字節
int[(m)]
有符號值:-2147683648 到2147683647(- 231 到231- 1)
無符號值:0到4294967295(0 到232 - 1)
4個字節
bigint[(m)]
有符號值:-9223372036854775808 到9223373036854775807(- 263到263-1)
無符號值:0到18446744073709551615(0到264 – 1) 8個字節
float[(m, d)]
最小非零值:±1.175494351e - 38
double[(m,d)]
最小非零值:±2.2250738585072014e - 308
decimal (m, d)
可變;其值
的范圍依賴於m 和d
表2:數值列
類型的取值范圍
各種
類型值所需
的存儲量如表3所示。
類型說明
存儲需求
tinyint[(m)]
1字節
smallint[(m)]
2字節
mediumint[(m)]
3字節
int[(m)]
4字節
bigint[(m)]
8字節
float[(m, d)]
4字節
double[(m, d)]
8字節
decimal (m, d)
m字節(
mysql < 3.23),m+2字節(
mysql > 3.23 )