国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql 整型int數字溢出在程序和數據庫設計中的考慮

2024-07-24 12:38:34
字體:
來源:轉載
供稿:網友

在數據庫設計和程序中需要考慮數字的范圍,否則可能導致一些問題,主要是考慮溢出的問題,比如如果數據庫中有一個整型的數字字段,里面的數據可能隨著業務的增長而膨脹,而這個數字有可能會超出列屬性的范圍,也就是溢出,與此同時,程序中也需要處理這個日益龐大的數字,如果其中有運算、數字類型的邏輯比較等等,也可能導致某天就出現了異常,而這種錯誤又是難以發現的.

以下試以整型int拋磚引玉:

一:MySQL5

以MySQL5版本為例,大多數管理員可能把自增數字、或者其它應用數字字段的列屬性設置為int類型,int占用4個字節,而int又分為無符號型和有符號性。對于無符號型的范圍是0 到 4294967295;有符號型的范圍是-2147483648 到 2147483647。參考資料可見mysql手冊:11.2. 數值類型.

當要在一個數值列內保存一個超出該列允許范圍的值時,MySQL的操作取決于此時有效的SQL模式。如果模式未設置,MySQL將值裁剪到范圍的相應端點,并保存裁減好的值。但是,如果模式設置為traditional(“嚴格模式”),超出范圍的值將被拒絕并提示錯誤,并且根據SQL標準插入會失敗。請參見mysql手冊5.3.2節:“SQL服務器模式”。

如果INT列是UNSIGNED,列范圍的大小相同,但其端點會變為到0和4294967295。如果你試圖保存-9999999999和9999999999,以非嚴格模式保存到列中的值是0和4294967296。

如果在浮點或定點列中分配的值超過指定(或默認)精度和標度規定的范圍,MySQL以非嚴格模式保存表示范圍相應端點的值。

當MySQL沒有工作在嚴格模式時,對于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT語句,由于裁剪發生的轉換將報告為警告。當MySQL工作在嚴格模式時,這些語句將失敗,并且部分或全部值不會插入或更改,取決于是否表為事務表和其它因素。詳情參見mysql手冊5.3.2節:“SQL服務器模式”。

二:php5:

1:整型數的字長和平臺有關,PHP 不支持無符號整數。

2:如果給定的一個數超出了 integer 的范圍,將會被解釋為 float。同樣如果執行的運算結果超出了 integer 范圍,也會返回 float。如果在程序中有對數字類型做比較,可能會產生問題。

3:可以查看PHP_INT_SIZE、PHP_INT_MAX,以確定整數的范圍。

以下列子可供參考,在32位服務器下,以下是代碼片段:

  1. [shengting@localhost ~]$ php -r "echo PHP_INT_SIZE;"  
  2. [shengting@localhost ~]$ php -r "echo PHP_INT_MAX;"  
  3. 2147483647 
  4. [shengting@localhost ~]$ php -r "var_dump(2147483647);"  
  5. int(2147483647) 
  6. [shengting@localhost ~]$ php -r "var_dump(2147483648);" 
  7. float(2147483648) 
  8. [shengting@localhost ~]$ php -r "var_dump(-2147483647);" 
  9. int(-2147483647) 
  10. [shengting@localhost ~]$ php -r "var_dump(-2147483648);" 
  11. float(-2147483648) 
  12. [shengting@localhost ~]$ php -r "var_dump(4294967295);" 
  13. float(4294967295) 
  14. [shengting@localhost ~]$ php -r "var_dump(4294967296);" 
  15. float(4294967296)   

在64位服務器下,代碼如下:

  1. [root@login shengting]# php -r "echo PHP_INT_SIZE;"  
  2. [root@login shengting]# php -r "echo PHP_INT_MAX;"  
  3. 9223372036854775807 
  4. [root@login shengting]# php -r "var_dump(2147483647);"  
  5. int(2147483647) 
  6. [root@login shengting]# php -r "var_dump(2147483648);" 
  7. int(2147483648) 
  8. [root@login shengting]# php -r "var_dump(-2147483647);" 
  9. int(-2147483647) 
  10. [root@login shengting]# php -r "var_dump(-2147483648);" 
  11. int(-2147483648) 
  12. [root@login shengting]# php -r "var_dump(4294967295);" 
  13. int(4294967295)  --Vevb.com 
  14. [root@login shengting]# php -r "var_dump(4294967296);" 
  15. int(4294967296) 

三:C/C++

對C/C++也存在有符號和無符號類型的問題.

對于32位系統,如果使用有符號int、long來定義變量保存唯一號就可能出現溢出,并出現上述問題.

對于64位系統,如果使用int來定義變量保存唯一號就可能出現溢出,并出現上述問題.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 美姑县| 望都县| 潜江市| 望城县| 凤城市| 阳原县| 平邑县| 怀柔区| 巨野县| 九龙县| 鄱阳县| 太和县| 连平县| 集安市| 西城区| 沙田区| 赤水市| 邹平县| 黄大仙区| 田林县| 武夷山市| 平乡县| 绿春县| 衡水市| 上饶市| 宜川县| 凤庆县| 莱阳市| 胶南市| 怀仁县| 宿州市| 四川省| 六安市| 株洲县| 尉犁县| 井研县| 峨眉山市| 柘荣县| 桂平市| 青河县| 云和县|