Mysql数据类型之整数型的一些细节你get到了吗?
Mysql數據類型之整數型篇
數據類型概述
Mysql里的數據類型主要有數值型(整形、浮點型)、時間類型、字符串類型、JSON類型、坐標類型、混合類型(整數或字符串)。
數值型范圍表格
| 數據類型 | 存儲位數 | 數據范圍 |
| 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 | 有符號:-2^63?- 2^63-1 無符號: 0–2^64-1 |
| decimal(M, N) | 1–29 | M 1到65 N 0到38,M大于等于N |
| float | 4 | 總位數65(其中小數部分38) |
| double | 8 | 總位數65(其中小數部分38) |
| bit(M) | 1-8 | 1-64 bits |
例如:
1 decimal(5,2) 即小數點后面是2位,總5位(整數部分3位),所以范圍是-999.99-999.99。
2 針對float不能用等于或者不等于比較符。
3 bit類型的存儲字節與其位數有關,FLOOR((M+7)/8) 字節。
范圍代碼驗證
CREATE TABLE tb_datatype( smallintcol smallint signed ) -- 1 僅有smallint時等價于smallint signed 符號類型 -- 2 指定unsigned時數據存的是正整數 -- 3 以有符號smallint為例驗證數據范圍(-32768到32767) INSERT INTO tb_datatype VALUES(-32768) INSERT INTO tb_datatype VALUES(32767) SELECT * FROM tb_datatype-- 1 反例驗證smallint范圍 INSERT INTO tb_datatype VALUES(-32769) > 1264 - Out of range value for column 'smallintcol' at row 1INSERT INTO tb_datatype VALUES(32768) > 1264 - Out of range value for column 'smallintcol' at row 1 > 時間: 0s-- 2 反例驗證decimal范圍 #2.1 整數部分最多65位 ALTER TABLE tb_datatype ADD decimalcol decimal(66,29) > 1426 - Too big precision 66 specified for 'decimalcol'. Maximum is 65 > 時間: 0s-- #2.2 小數點最多38位 ALTER TABLE tb_datatype ADD decimalcol decimal(65,39) > 1425 - Too big scale 39 specified for 'decimalcol'. Maximum is 38 > 時間: 0s數值類型的屬性
設置顯示位數
在數值類型定義時指定顯示的寬度(位數)M。
注意:這里的M是用于顯示的,并不能限制數值類型的存儲范圍。比如我們定義了字段smallintcol2并指定它的顯示寬度是3,但我們也可以存超過3位數的數字。
ALTER TABLE tb_datatype ADD smallint(3) UPDATE tb_datatype SET SMALLINTcol2 = 9999 WHERE id=1 ; UPDATE tb_datatype SET SMALLINTcol2 = 99 WHERE id=2 ;設置零填充(ZEROFILL)
數值顯示寬度M是和ZEROFILL結合一起使用的,即如果實際存儲的數值比定義的位數M小則左邊用”0”填充。比如我們定義了字段smallintcol3的顯示寬度M是3,并且是ZEROFILL的。
ALTER TABLE tb_datatype ADD smallintcol3 smallint(3) ZEROFILL UPDATE tb_datatype SET SMALLINTcol3 = 9999 WHERE id=1 ; UPDATE tb_datatype SET SMALLINTcol3 = 99 WHERE id=2 ;此時我們可以看到當99存進去時,顯示的是三位的”099”,當實際存儲位大于指定的寬度M時照常顯示。
注意事項:
1 表達式或者UNION對屬性為ZEROFILL的字段”免疫”,即還是當成普通的數值類型。詳見下例:
SELECT * FROM tb_datatype WHERE SMALLINTcol3 < 100SELECT SMALLINTcol3 FROM tb_datatype WHERE id = 2 UNION SELECT 111 結果為 99 1112 如果指定ZEROFILL則mysql數據庫系統自動加上UNSIGNED屬性。
3 ZEROFILL 屬性會被遺棄,建議用其它方法替換,比如LPAD,見下例;
有符號類型
有符號類型屬性是指定存儲的都是正整數即不能是負的。
ALTER TABLE tb_datatype ADD smallintcol4 smallint UNSIGNEDUPDATE tb_datatype SET SMALLINTcol4 = 1999 WHERE id=1 > Affected rows: 1 > 時間: 0.331s-- 插入負整數時報超出數據范圍的錯。 UPDATE tb_datatype SET SMALLINTcol4 = -99 WHERE id=2 > 1264 - Out of range value for column 'smallintcol4' at row 2 > 時間: 0s自增 AUTO_INCREMENT
字段自增(AUTO_INCREMENT)即指定字段的內容由數據庫來維護其值和增幅(步長),默認值是1,增幅為1。
alter table tb_datatype add column seq int auto_increment not null, add primary key(seq);此時我們可以看到seq自動有了值1和2,因為當前表有2行。
注意事項:
1 不能將NULL插入含自增的字段,插入失敗后自增對應的系統序列(sequence)會+1(步長)。
2 一般把0插入到自增字段里,除非打開NO_AUTO_VALUE_ON_ZERO模式(不建議)。
3 自增列不支持負數。
4 ?檢查(CHECK)約束里不能使用含自增的字段。
5 自增屬性一般只針對正整數類型的字段,FLOAT和DOUBLE類型的字段將不再支持。
完整代碼
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for tb_datatype -- ---------------------------- DROP TABLE IF EXISTS `tb_datatype`; CREATE TABLE `tb_datatype` (`id` int(11) NULL DEFAULT NULL,`smallintcol` smallint(6) NULL DEFAULT NULL,`smallintcol2` smallint(3) NULL DEFAULT NULL,`decimalcol` decimal(65, 38) NULL DEFAULT NULL,`smallintcol3` smallint(3) UNSIGNED ZEROFILL NULL DEFAULT NULL,`smallintcol4` smallint(5) UNSIGNED NULL DEFAULT NULL,`seq` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`seq`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of tb_datatype -- ---------------------------- INSERT INTO `tb_datatype` VALUES (1, -32768, 9999, NULL, 9999, 1999, 1); INSERT INTO `tb_datatype` VALUES (2, 32767, 99, NULL, 099, NULL, 2);SET FOREIGN_KEY_CHECKS = 1;總結
以上是生活随笔為你收集整理的Mysql数据类型之整数型的一些细节你get到了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 歼11D与歼16的区别在哪里?
- 下一篇: Mysql数据类型之浮点与二进制型数据使