数据类型【TINYINT、SMALLINT、INT、BIGINT、decimal(18,2)】表示意思

数据类型 占用字节 占用位数 取值范围(有符号)
INT8 / TINYINT 1 字节 8 位 -128 到 +127
INT16 / SMALLINT 2 字节 16 位 -32,768 到 +32,767
INT32 / INT 4 字节 32 位 -21亿 到 +21亿
INT64 / BIGINT 8 字节 64 位 约 ±922亿亿

Q:TINYINT 就是1字节 为什么可以存-128 到127呢?

A:你说得非常对,TINYINT 确实只占用 1 个字节(即 8 个比特位)。

之所以能存储 -128 到 127 这么"不整齐"的范围,是因为计算机在存储有符号整数时,采用的是二进制补码(Two's Complement)规则,而不是我们直觉中的"原码"。

这里有三个关键点可以帮你理解:

8 个比特位的排列组合

1 字节 = 8 位。每一位可以是 0 或 1,所以总共能表示的状态数是 2^8 = 256 种。

如果是无符号(unsigned)类型,这 256 个状态全部用来表示正数,范围就是 0 到 255。

但在有符号(signed)类型中,我们需要表示负数。最左边的那一位(最高位)被规定为符号位:

0 开头表示正数。

1 开头表示负数。

为什么不是 -127 到 127?

你可能会觉得,既然有一位用来做符号了,剩下的 7 位表示数值(2^7=128),范围应该是 -127 到 +127(共 255 个数)。

这里有两个关键原因导致范围变成了 -128 到 127:

原因一:0 的位置

在计算机中,0 被视为正数(或者说非负数),它的二进制是 0000 0000。

这意味着,正数阵营里,0 占用了一个名额。所以正数剩下的名额只有 127 个(从 1 到 127)。

如果不把 0 算在负数里,正数那边就比负数多占了一个位置,为了平衡,负数那边必须多"借"一个位置。

原因二:补码的"负零"机制(核心原因)

这是最根本的原因。在补码规则中,二进制 1000 0000 被定义为 -128,而不是 -0。

复制代码
让我们看看具体的对应关系:
0111 1111 = +127 (最大值)
0000 0001 = +1
0000 0000 = 0
1111 1111 = -1
1000 0001 = -127
1000 0000 = -128 (最小值)

总结

因为计算机利用 1000 0000 这个特殊的组合来表示 -128,而不是浪费它来表示"负零",所以负数那边能存到 -128,而正数那边因为包含了 0,最大值只能到 127。

套用到 TINYINT (n=1):

最小值:-2^7 = -128

最大值:2^7 - 1 = 127

deciaml (18,2) 是什么意思

DECIMAL(18, 2) 是数据库中一种用于存储精确数值的数据类型,常用于需要高精度的场景,比如金融领域的金额计算。

简单来说,它的含义是:总共可以存储 18 位数字,其中小数点后固定保留 2 位。

📝 参数详解

DECIMAL(p, s) 由两个参数定义:

p (Precision / 精度):代表数字的总位数,包括小数点左边(整数部分)和右边(小数部分)的所有数字。在你的例子中,p 是 18。

s (Scale / 标度):代表小数点后可以存储的位数。在你的例子中,s 是 2。

💡 以 DECIMAL(18, 2) 为例

根据上面的定义,我们可以算出它的存储能力:

总位数:18 位。

小数位数:2 位。

整数位数:总位数 - 小数位数 = 18 - 2 = 16 位。

这意味着,使用 DECIMAL(18, 2) 的字段:

最大值:9999999999999999.99 (16个9 + .99)

最小值:-9999999999999999.99

✨ 主要特点

精确存储:与 FLOAT 或 DOUBLE 不同,DECIMAL 是一种定点数类型,它能精确地存储你输入的数值,不会因为二进制转换而产生微小的精度误差。例如,0.1 + 0.2 的结果就是精确的 0.3,而不是 0.30000000000000004。

自动补零:如果你插入的数字小数位不足 2 位,数据库会自动补零。例如,插入 123 会被存储为 123.00。

四舍五入:如果你插入的数字小数位超过 2 位,数据库通常会进行四舍五入。例如,插入 1.237 会被存储为 1.24。

📊 适用场景

由于其精确性,DECIMAL 类型是存储以下数据的理想选择:

货币金额:商品的价格、账户余额、交易流水等。

科学数据:需要固定精度的实验测量值。

税率、利率:任何不允许有计算误差的百分比数值。

相关推荐
wuqingshun3141593 小时前
MYSQL中如果发生死锁应该如何解决?
数据库·mysql
DO_Community3 小时前
Weaviate 托管数据库现已在 DigitalOcean 上开放公测
数据库·人工智能·开源·向量数据库·weaviate
报错小能手3 小时前
索引常见面试题
数据库
Database_Cool_3 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库
其实防守也摸鱼3 小时前
渗透--损坏的对象级别鉴权漏洞(Broken Object Level Authorization, BOLA)
大数据·网络·数据库·学习·tcp/ip·安全·安全威胁分析
hehelm4 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++
农村小镇哥4 小时前
如何限定IP访问Oracle数据库
数据库·tcp/ip·oracle
cfm_29144 小时前
SpringBoot 数据库全栈整合
数据库·spring boot·后端
是上好佳佳佳呀4 小时前
MySQL 基础:从数据库概念到表结构管理DDL
数据库·mysql
Nturmoils4 小时前
Oracle 迁移评估时,我把这两类问题列在了检查清单最前面
数据库