在使用MySQL時(shí),經(jīng)常會(huì)遇到數(shù)據(jù)類型轉(zhuǎn)化的問題,其中一個(gè)比較容易出現(xiàn)問題的類型就是bigint。
bigint是MySQL中的一種整型數(shù)據(jù)類型,其存儲(chǔ)范圍遠(yuǎn)遠(yuǎn)超過了其他整型類型(如int、tinyint等),可以存儲(chǔ)的最大值達(dá)到了9223372036854775807,比其他類型大約為10^9級(jí)別。因此,在需要存儲(chǔ)大量數(shù)據(jù)時(shí),常常會(huì)使用bigint類型。
然而,當(dāng)bigint類型與其他類型進(jìn)行計(jì)算時(shí),會(huì)出現(xiàn)一些坑,尤其是在PHP中使用MySQL時(shí),需要特別注意。
//示例代碼 $num = 9223372036854775807; $str = '9223372036854775807'; //比較 var_dump($num == $str); //bool(true) var_dump($num === $str); //bool(false) //加法運(yùn)算 var_dump($num + $str); //float(1.844674407371E+19) //減法運(yùn)算 var_dump($num - $str); //float(0)
上述代碼中,我們定義了一個(gè)最大值的bigint類型數(shù)字和一個(gè)字符串,分別進(jìn)行了比較和加減法運(yùn)算。結(jié)果讓人有些意外。
首先是比較操作,由于PHP中存在類型轉(zhuǎn)換的運(yùn)算,第一個(gè)比較結(jié)果為true。但是在類型嚴(yán)格比較時(shí),結(jié)果為false。
接下來是加減法運(yùn)算。雖然我們期望的結(jié)果是一個(gè)大整數(shù),但是“1.844674407371E+19”顯然不是我們想要的結(jié)果。這是由于PHP對(duì)大整數(shù)的處理有所限制,必須在計(jì)算前將其轉(zhuǎn)化為浮點(diǎn)數(shù),因此結(jié)果就產(chǎn)生了偏差。
因此,使用bigint類型時(shí)要注意進(jìn)行類型轉(zhuǎn)換,或者使用其他方式進(jìn)行計(jì)算,比如使用gmp擴(kuò)展進(jìn)行高精度計(jì)算。