這篇文章介紹的內容是關於MYSQL:int類型升級到bigint,對PHP開發語言影響 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
因為業務增長,原有的unsigned int已經不夠使用,需要升級到unsigned bigint
MYSQL整數支援的範圍:
https://dev.mysql.com/doc/refman/5.7/en/integer-types.html
Type |
Storage |
Minimum Value |
Maximum Value |
|
(Bytes) |
(Signed/Unsigned) |
(Signed/Unsigned) |
TINYINT |
1 |
-128 |
127 |
|
|
0 |
255 |
SMALLINT |
2 |
-32768 |
32767 |
|
|
0 |
65535 |
MEDIUMINT |
3 |
-8388608 |
8388607 |
|
|
0 |
16777215 |
INT |
4 |
-2147483648 |
2147483647 |
|
|
0 |
4294967295 |
BIGINT |
8 |
-9223372036854775808 |
9223372036854775807 |
|
|
0 |
18446744073709551615 |
可以看到bigint支援的數量級非常大。雖然mysql欄位類型調整了,但是我們的開發語言是否支援呢?
PHP5.6 64版本:
PHP的int型範圍是PHP_INT_MIN(PHP7可用) - PHP_INT_MAX
,
比如在x64-php下,int的最大範圍是:9223372036854775807,對應MYSQL的BIGINT類型
!window下PHP7之前的版本總是32位的,且以下行為會跟下面列出來的點不同
!不支援無符號的整數
超過這個範圍的int數,將會轉化為float型。我們知道,表單提交或者從資料庫取出的資料,是字串類型,當我們用PHP進行運算的時候,以下幾點需要注意的:
可參考:http://php.net/manual/zh/language.types.integer.php
1)intval函數,該函數輸出只支援int型範圍,超過這個範圍的需要使用字串表示
$number = "9223372036854775900";var_dump(intval($number));//output,預設返回PHP_INT_MAX最大值int(9223372036854775807)
2)int型作為數組索引值,會溢出,因此解決方案需要把鍵轉化為字串
$arr = [];$arr[9223372036854775900] = '1';var_dump($arr);//outputarray(1) { [-9223372036854775808]=> string(1) "1"}
3)json_decode影響
如果資料超出了int的範圍,解析出來的是float型
$str = '[9223372036854775807,9223372036854775907]';var_dump(json_decode($str));//outputarray(2) { [0]=> int(9223372036854775807) [1]=> float(9.2233720368548E+18)}
此外,PHP無法支援unsigned bigint