以下試以整型(int)拋磚引玉:
一:MySQL5
以MySQL5版本為例,大多數管理員可能把自增數字、或者其它應用數字欄位的列屬性設定為int類型,int佔用4個位元組,而int又分為無符號型和有符號性。對於無符號型的範圍是0 到 4294967295;有符號型的範圍是-2147483648 到 2147483647。參考資料可見mysql手冊:11.2. 數實值型別.
當要在一個數值列內儲存一個超出該列允許範圍的值時,MySQL的操作取決於此時有效SQL模式。如果模式未設定,MySQL將值裁剪到範圍的相應端點,並儲存裁減好的值。但是,如果模式設定為traditional(“strict 模式”),超出範圍的值將被拒絕並提示錯誤,並且根據SQL標準插入會失敗。請參見mysql手冊5.3.2節:“SQL伺服器模式”。
如果INT列是UNSIGNED,列範圍的大小相同,但其端點會變為到0和4294967295。如果你試圖儲存-9999999999和9999999999,以非strict 模式儲存到列中的值是0和4294967296。
如果在浮點或定點列中分配的值超過指定(或預設)精度和標度規定的範圍,MySQL以非strict 模式儲存表示範圍相應端點的值。
當MySQL沒有工作在strict 模式時,對於ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT語句,由於裁剪髮生的轉換將報告為警告。當MySQL工作在strict 模式時,這些語句將失敗,並且部分或全部值不會插入或更改,取決於是否表為事務表和其它因素。詳情參見mysql手冊5.3.2節:“SQL伺服器模式”。
二:php5:
1:整型數的字長和平台有關,PHP 不支援不帶正負號的整數。
2:如果給定的一個數超出了 integer 的範圍,將會被解釋為 float。同樣如果執行的運算結果超出了 integer 範圍,也會返回 float。如果在程式中有對數字類型做比較,可能會產生問題。
3:可以查看PHP_INT_SIZE、PHP_INT_MAX,以確定整數的範圍。
以下列子可供參考:
在32位伺服器下:
以下是程式碼片段:
代碼如下 |
複製代碼 |
[shengting@localhost ~]$ php -r "echo PHP_INT_SIZE;" 4 [shengting@localhost ~]$ php -r "echo PHP_INT_MAX;" 2147483647 [shengting@localhost ~]$ php -r "var_dump(2147483647);" int(2147483647) [shengting@localhost ~]$ php -r "var_dump(2147483648);" float(2147483648) [shengting@localhost ~]$ php -r "var_dump(-2147483647);" int(-2147483647) [shengting@localhost ~]$ php -r "var_dump(-2147483648);" float(-2147483648) [shengting@localhost ~]$ php -r "var_dump(4294967295);" float(4294967295) [shengting@localhost ~]$ php -r "var_dump(4294967296);" float(4294967296) |
在64位伺服器下:
以下是程式碼片段:
代碼如下 |
複製代碼 |
[root@login shengting]# php -r "echo PHP_INT_SIZE;" 8 [root@login shengting]# php -r "echo PHP_INT_MAX;" 9223372036854775807 [root@login shengting]# php -r "var_dump(2147483647);" int(2147483647) [root@login shengting]# php -r "var_dump(2147483648);" int(2147483648) [root@login shengting]# php -r "var_dump(-2147483647);" int(-2147483647) [root@login shengting]# php -r "var_dump(-2147483648);" int(-2147483648) [root@login shengting]# php -r "var_dump(4294967295);" int(4294967295) [root@login shengting]# php -r "var_dump(4294967296);" int(4294967296) |
三:C/C++
對C/C++也存在有符號和無符號類型的問題。
對於32位系統,如果使用有符號int、long來定義變數儲存唯一號就可能出現溢出,並出現上述問題。
對於64位系統,如果使用int來定義變數儲存唯一號就可能出現溢出,並出現上述問題