mysql数据类型之整数型的一些细节你get到了吗?(代码片段)

ShenLiang2025 ShenLiang2025     2022-12-29     189

关键词:

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;

java中的堆内存与栈内存,你get到了吗?

...一种是「堆内存」。我们平时在函数中定义的一些「基本类型的变量」和「对象的引用变量」都是在函数的「栈内存」中分配的。当我们在一段「代码块」中定义一个变量时,Java就会在栈中为这个变量分配「内存空间」,当超... 查看详情

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

...众知道我们表达的内容。那么如何提高PPT设计呢?配色:一些好看的PPT,从头到尾看起来都是一个色,保持的很一致呀。如下图的这个文艺双12策划方案书,整体的颜色控制在蓝色范围中(该PPT预览图来自办公资源网,需要的可... 查看详情

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

...众知道我们表达的内容。那么如何提高PPT设计呢?配色:一些好看的PPT,从头到尾看起来都是一个色,保持的很一致呀。如下图的这个文艺双12策划方案书,整体的颜色控制在蓝色范围中(该PPT预览图来自办公资源网,需要的可... 查看详情

<jdbc>获取数据库连接的五种方式:你真的get到了吗?

...录一、概述🔥体系结构🔥JDBC编写顺序二、获取数据库连接🔥要点一& 查看详情

跟王老师学mysql:mysql数据类型之整数类型

跟王老师学MySQL:MySQL数据类型之整数类型主讲教师:王少华   QQ群号:483773664MySQL的数据类型包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制数据类型。学习目标整型包括哪些类型以... 查看详情

跟王老师学mysql:mysql数据类型之整数类型

跟王老师学MySQL:MySQL数据类型之整数类型主讲教师:王少华   QQ群号:483773664MySQL的数据类型包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制数据类型。学习目标整型包括哪些类型以... 查看详情

pytest的高级用法,你get到了吗?

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试目前大家听到比较多的单元测试框架,无非就是pyte... 查看详情

求职充电|这些实战干货你get了吗?

...年的求职热潮。但是,在面试之前,这些技能你get了吗?数据库案例经验、Python编程上手、网络设计方案、运维技巧攻略......现在,你只能站在前人的肩膀上,丰富自己的工作阅历。请接住,这个求职充电大礼包!!! 查看详情

it轮子系列——excel上传与解析,一套代码解决所有excel业务上传,你get到了吗

...,excel的上传与解析是很常见的。根据业务不同,解析的数据模型也都不一样。不同的数据模型也就需要不同的校验逻辑,这往往需要写多套的代码进行字段的检验,如必填项,数据格式。为了避免重复编写逻辑检验代码,于是... 查看详情

mysql之字段数据类型和列属性

...数值型:  数值型数据:都是数值,系统将数值型分为整数型和小数型。   整数型:  存放整形的数据,在SQL中因为更多考虑如何节省磁盘空间,所以系统将整形又细分为5类。 SQL中的数值类型全部 查看详情

mysql新手一些细节

<formmethod="get"action="06_charushujuku.php"> <p> 请输入你的学号: <inputtype="text"name="sid"/> </p> <p> 请输入你的姓名: <inputtype="text"name="names"/> </p> 查看详情

提高工作效率必杀技,你get到了吗?

...ot;美女,帮忙发一封邮件""×××姐,帮忙统计个个数据呗,我忙不开了""我先下班了,后面的活儿帮忙搞定一下"……..当领导和你催要文件,自己忙得焦头烂额时,一定要分清事情的轻重缓急,和其他寻求你&quo... 查看详情

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

...的API用来进行分布式训练,由于最近做的工作涉及到一些分布式训练的细节,在使用中发现一些之前完全不会care的点,现记录于此,希望对有需求的同学有所帮助。本文包含:pytorch分布式训练的工作原理介绍... 查看详情

提升市场竞争力,这些细节你都把握了吗?

...代、美术和性能的需求平衡,单从每个版本的上万帧测试数据中定位真正的性能瓶颈,其工作量就已可想而知。无论项目是否复杂或简单,当我们开展优化工作前,这些问题都需在胸中有丘壑。那么如何井然有序地定位和排查性... 查看详情

javase经典面试问题(必须熟背),你get到了吗?

JAVASE经典面试问题(必须熟背)1.编译java程序使用什么命令?运行java使用什么命令?javac*.javajava类名2.什么是JDK,什么是JRE,JDK与JRE有什么区别?JDK:JavaDevelopmentToolkitJava开发工具包JRE:JavaRuntimeEnviormentJava运行时环境区别:开发JAVA程... 查看详情

程序猿必备技能之mysql基础篇(代码片段)

  MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的基础内容。1.MySQL基础1.1.简介  MySQL是关系型数据存储容器,它将数据以特定的格式存储到内存或者文件中,MySQL是目前主流的... 查看详情

mybatis延迟加载的三种加载方式深入,你get了吗?

...载,只有对关联对象是延迟加载。  延迟加载可以减轻数据库的压力,  延迟加载不可是一条SQL查询多表信息,这样构不成延迟加载,会形成直接加载。  延迟加载分为三种类型:1.直接加载执行完主对象之后,直接执行... 查看详情

mysql基础之常见数据类型

MySQL基础之常见数据类型原则:所选择的类型越简单越好,所需的类型的范围越小越好。一、数值型:整数:整型有如下特点:1-如果不设置有符号或者无符号,整型默认是有符号的,如果设置无符号&#x... 查看详情