Mysql数据类型之整数型的一些细节你get到了吗?

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 1

INSERT 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 < 100

SELECT SMALLINTcol3 FROM tb_datatype WHERE id = 2
UNION
SELECT 111
结果为
99
111

2 如果指定ZEROFILL则mysql数据库系统自动加上UNSIGNED属性。
3 ZEROFILL 属性会被遗弃,建议用其它方法替换,比如LPAD,见下例;

SELECT LPAD('99',3,'0')

有符号类型

有符号类型属性是指定存储的都是正整数即不能是负的。

ALTER TABLE tb_datatype ADD smallintcol4 smallint UNSIGNED

UPDATE 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到了吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的堆内存与栈内存,你Get到了吗?

PyTorch分布式训练进阶:这些细节你都注意到了吗?

大数据的真正价值在哪里?你get到了吗?

大数据的正确用法你get到了吗?

Harbor发文计划,这些技能你get到了吗?

四个PPT设计技巧,你get到了吗?