MySQL中数值类型(列类型)与显示宽度

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL中数值类型(列类型)与显示宽度

所谓的数据类型:对数据进行统一的分类。从系统的角度出发为了能够使用统一的方式进行管理,以便更好的利用有限的资源空间。

SQL将数据分为了三大类:数值类型、字符串类型和时间日期型。

如下图所示:

f1d73690175449ad8a4f7a2e33cfa7ac.png其中数值类型分为整数型和小数型。


image.png

【1】整数型

① 有符号

CREATE TABLE `my_int` (
  `int_1` tinyint(4) DEFAULT NULL,
  `int_2` smallint(6) DEFAULT NULL,
  `int_3` mediumint(9) DEFAULT NULL,
  `int_4` int(11) DEFAULT NULL,
  `int_5` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

806522c839c54967a26e7612f746f9f8.png

插入最大范围值

insert into my_int VALUES(127,32767,8388607,2147483647,9223372036854775807);

② 无符号

CREATE TABLE `my_int_unsigned` (
  `int_1` tinyint(3) unsigned DEFAULT NULL,
  `int_2` smallint(5) unsigned DEFAULT NULL,
  `int_3` mediumint(8) unsigned DEFAULT NULL,
  `int_4` int(10) unsigned DEFAULT NULL,
  `int_5` bigint(20) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

46aebbeed847434f838534c42b7c9c51.png插入最大范围值

insert into my_int_unsigned VALUES(255,65535,16777215,4294967295,18446744073709551615);

③ 显示宽度

数据类型中int (10) 或者数据表中的长度:这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。(有符号时,负号占一位,正数不计符号位)。

显示宽度和数据类型的取值范围是无关的。

显示宽度只是指明MYSQL最大可能显示的数字个数,数值的位数小于指定的宽度时会有零填充(使用了zerofill),如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能显示出来。

假设声明一个INT类型的字段 YEAR INT(4) ,该声明指明,在year字段中的数据一般只显示4位数字的宽度。

例如,向year字段插入一个数值19999,当使用select查询的时候,MYSQL显示的将是完整带有5位数字的19999,而不是4位数字的值。如果不指定显示宽度,则MYSQL为每一种类型指定默认的宽度值

再次强调显示宽度只用于显示,并不能限制取值范围和占用空间,例如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。

那么疑问就来了,这个有什么意义?往下看。

④ 零填充zerofill

zerofill:零填充;当插入数据长度不够表结构中的字段长度时,左边使用零进行填充。zerofill会自动将字段类型设置为无符号。

ALTER TABLE my_int_unsigned MODIFY int_6 TINYINT(3) ZEROFILL;
--表示显示宽度为三,当不够时,使用0填充;超出时,只要不超出数据类型最大值,仍正常显示。
desc my_int_unsigned;

fb544074ae43454a82568e8e578cc544.png

INSERT into my_int_unsigned VALUES(100,100,100,100,100,1);
SELECT * FROM my_int_unsigned

342f86b99ef645788b86f5b45bbba273.png

可见,意义在于使用了zerofill时,长度不足时左侧会自动补零。保证了数据的格式化,如select下拉框不会因为数值长度而改变宽度。

但是当不使用zerofill时,显示宽度的指定没有意义,使用默认值即可。

在navicat for mysql工具下未显示区别。


b8574f888a6c4e59a360a53729e98077.png

【2】小数型

小数型:带有小数点或范围超出整型的数值类型;SQL中又将小数型分为浮点型和定点型。

  • 浮点型:小数点浮动,精度有限,超出指定范围后会丢失精度(自动四舍五入);
  • 定点型:小数点固定,精度固定,不会丢失精度。

① 浮点型

浮点型数据分为float和double。

  • ① Float:单精度,占用 4 个字节存储数据,精度范围为 7 位左右;
  • ② Double:双精度,占用 8 个字节存储数据,精度范围为 15 位左右。
create table my_float(
f1 FLOAT,
f2 float(10,2),--10位在精度范围之外
f3 float(6,2)--6位在精度范围之内
)charset utf8;
desc my_float;

f40107e54f0d47ab802b14ac1036cde3.png

插入数据,可以是小数,也可以是科学计数法。整型部分不能超出长度,小数部分可以,系统会自动进行四舍五入。

insert into my_float VALUES(1000.10,1000.10,1000.10);
insert into my_float VALUES(1234567890,12345678.90,1234.56);
insert into my_float VALUES(3e38,3.01e7,1234.56);
insert into my_float VALUES(9999999999,99999999.99,9999.99);

533f3fefbd4c4605abfe4a22d952268b.png

可以看到,float保证精度范围在7位左右,使第二,第四行数据分别发生了进位。甚至第四行前两列数值由于进位变成了 11 位有效数字!!!9999.99由于在精度范围内,故未发生进位 !

insert into my_float VALUES(123456,1234.12345678,123.9876543);--小数部分超出
insert into my_float VALUES(123456,1234.12,12345.56);--整数部分超出

89573f5653c542e8b622aeffe89f4c85.png

可以看到,小数部分超出会自动截取;整数部分超出则插入失败!!

**结论:**浮点数一定会进行四舍五入(超出精度范围);浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立!


即,如果数据比较大,且有小数点要求精度准备,浮点数不是一个优良选择!!!


② 定点型

定点型:绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分你有可能(理论上小数部分也不会丢失精度)。

插入数据

定点数的整数部分一定不能超出长度(即使是系统进位造成的也不可以),小数部分的长度可以随意超出(系统自动四舍五入)。

create table my_decimal(
f1 float(10,2),
d1 decimal(10,2)
)charset utf8;
desc my_decimal;


87193537f4b54e168ab2ea30a3a6328d.png

insert into my_decimal values(12345678.90,12345678.90);
insert into my_decimal values(1234.123456,1234.123456); 
--小数部分超出长度,会自动四舍五入
select * from my_decimal;



fe409ef008b04af8b95cbc6547fe97c6.png

如果系统进位导致长度超出呢?

insert into my_decimal values(99999999.99,99999999.99);--浮点数进位,定点数正常;
insert into my_decimal values(99999999.99,99999999.999);--二者都会发生进位,但是定点数会报出异常


090103091c4d41cca74eaed52868c54e.png

select * from my_decimal

28146cc4a1ba49ca8f9674bf4c629e3a.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
44 8
|
2月前
|
关系型数据库 MySQL
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
这篇文章介绍了如何在DBeaver中创建MySQL表的枚举(ENUM)字段,并探讨了MySQL中ENUM类型的一些行为特点,例如ENUM值的默认排序和在插入重复值时的表现。
54 1
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
|
1月前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
30 0
|
6月前
|
分布式计算 DataWorks MaxCompute
DataWorks产品使用合集之需要将mysql 表(有longtext类型字段) 迁移到odps,但odps好像没有对应的类型支持,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
151 4
|
7月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错之在处理MySQL的DECIMAL类型时出现了报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
自然语言处理 算法 Java
Java如何判断两句话的相似度类型MySQL的match
【9月更文挑战第1天】Java如何判断两句话的相似度类型MySQL的match
27 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL bit类型增加索引后查询结果不正确案例浅析
【8月更文挑战第17天】在MySQL中,`BIT`类型字段在添加索引后可能出现查询结果异常。表现为查询结果与预期不符,如返回错误记录或遗漏部分数据。原因包括索引使用不当、数据存储及比较问题,以及索引创建时未充分考虑`BIT`特性。解决方法涉及正确运用索引、理解`BIT`的存储和比较机制,以及合理创建索引以覆盖各种查询条件。通过`EXPLAIN`分析执行计划可帮助诊断和优化查询。
|
4月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
4月前
|
关系型数据库 MySQL 数据管理
深入解析 MySQL 中的关系类型
【8月更文挑战第31天】
71 0