mysql 整型(int)數字溢出在程式和資料庫設計中的考慮

來源:互聯網
上載者:User

    以下試以整型(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來定義變數儲存唯一號就可能出現溢出,並出現上述問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.