数据类型【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 类型是存储以下数据的理想选择:

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

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

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

相关推荐
俺不要写代码3 小时前
数据库:DML
数据库·oracle
这个DBA有点耶3 小时前
两张百万级大表JOIN跑崩了?试试这3招
数据库·代码规范
IntMainJhy3 小时前
「Flutter三方库sqflite的鸿蒙化适配与实战指南:从入门到踩坑的本地数据库开发全记录」
数据库·flutter·华为·信息可视化·数据库开发·harmonyos
counting money3 小时前
Spring框架基础(依赖注入-全注解形式)
java·数据库·spring
计算机安禾3 小时前
【Linux从入门到精通】第33篇:数据库MySQL/MariaDB安装与基础调优
linux·数据库·mysql
瀚高PG实验室3 小时前
ERROR: invalid input syntax for type integer: “a“
数据库·瀚高数据库
S1998_1997111609•X3 小时前
论next/js在打击省份及犯罪行为集团的系统分析[特殊字符]设计
网络·数据库·百度·ssh·开闭原则
dfdfadffa3 小时前
如何创建仅在首次订阅时执行一次计算的 RxJS 懒加载 Observable
jvm·数据库·python
Irene19914 小时前
Oracle 中:为什么 from 子查询后面需要一个别名
数据库·oracle