MySQL 进阶–列类型之数值

学习要点:
1.整型
2.浮点型(非精确)
3.定点型(精确)


本节课, 我们重点了解一下 MySQL 中列类型的数值类型。 创建一个最恰当的存储数据的类型,不但可以节约数据库字段空间,还可以提升查询时的速度。
一. 整型
MySQL 数据库支持五种整型类型,包括: TINYINT、 SMALLINT、 MEDIUMINT、 INT 和BIGINT 五种。
blob.png
字节表示占用的空间, 1 个字节表示占用 8 位二进制。 无符号正整数, 最小的 8 位二进制 0000 0000 表示 0, 最大的 8 位二进制 1111 1111 表示 255, 那其实就是 TINYINT 类型。其它依此类推。不同的整型取值范围和存储空间也不同,字节越小,那么占用空间越小, 反之亦是如此。

如果选择整型的存储范围, 可以在创建表字段时, 选择类型属性: 无符号(UNSIGNED),表示整型都是正数。这样 TINYINT 的范围就为 0 ~ 255,是否有符号,都只占 1 个字节。
五种整型的适用场景:
1. TINYINT,年龄,包含在 0 ~ 255 之间;
2. SMALLINT,端口号,包含在 0 ~ 65535 之间;
3. MEDIUMINT,中小型网站注册会员, 1600 万够用;
4. INT,身份证编号, 42 亿可以用很久;
5. BIGINT, Twitter 微博量,几百亿。
PS:由于 MySQL 中不存在布尔类型,所以一般来说我们可以使用 TINYINT(1) 来创建字段,用 0 表示 false, 1 表示 true。在选择优化数据类型的时候, 原则上尽可能选小的, 通常这样速度更快, 占用空间最小,包括磁盘、内存和 CPU 缓存。并且,不要慷慨的包含所有可能遇到的情况,比如所有人的年龄都在 0 ~ 255 范围内,突然有个 300 岁进来,通常是选择拒绝入库。
举例说明:牛仔裤生产厂家生产小(偏瘦)、中(正常)、大号(偏胖)牛仔裤,而这三种类型占领市面 95%的市场。 但还有 5%超瘦和超胖, 则不会去生产。 因为为了这 5%, 却要投入了同样的生产设备成本、人力成本、营销策划成本,最终得不偿失。除了无符号(UNSIGNED)类型属性, 还有一个填充零(ZEROFILL)。 就是类型后面的位宽:
TINYINT(M)中的 M。 如果这里的 M 是 3, 那么默认显示三个数字, 不足在其前面用零填充。
并且,这里的 M 和 TINYINT 中的最大值位数毫无关系, M 设置成 5 也可以。
如果你直接设置 ZEROFILL 属性, 那么 UNSIGNED 属性也会自动被勾选, 因为填充零的首要条件就是无符号。填充零只是在显示的时候查看,而 MySQL 内部存储的还是没有填充的数值。在 Navicat 中,设置了 ZEROFILL 属性也看不到填充的零,为了方便查阅,但在MySQL 终端和 PHP 查询中,可以看到填充零。
二. 浮点型(非精确)
MySQL 数据库支持两种浮点类型: FLOAT(单精度)和 DOUBLE(双精度)两种
blob.png

稍微理解一下浮点型范围: 1.175494351E-38 是 1.175494351 * 10 的负 38 次幂,用 123.45E-2 举例,就是 1.2345;而 3.402823466E+38 是 3.402823466 * 10 的 38 次幂,用 123.45E+2 举例,就是 12345。所以,浮点型的范围完全足够我们日常开发使用,不用太多考虑。创建一个浮点型的格式为: FLOAT(M,D), M 为精度表示总长, D 为标度表示小数点后面的位数。比如 FLOAT(6,2),合法的数值为: 1234.56,表示小数点两位,整数四位。 如果是: 12345.6 就是非法,首先小数位是死的,所以,整数位不得大于四位。虽然浮点型的范围非常的充足,但精度却不够。单精度 FLOAT 会因为当前操作系统等
因素大概精度在 7 位左右, 双精度 DOUBLE 大概是 16 位左右。 比如: 输入 1234567.11, 会自动丢失精度变成 1234567.12。 所以, 在金融计算方面如果采用浮点型, 那就需要慎之又慎了。
PS:浮点型也支持 UNSIGNED 无符号和 ZEROFILL 填充零两个属性。
三. 定点型(精确)
浮点型由于内部的存储方式是数值,导致它在一定程度上取得的是近似值而非精确值。
如果使用定点型,那么就可以精确取得小数部分,因为它内部存储方式是字符串形式。
blob.png

创建一个定点型格式: DECIMAL(M,D),表示小数点 D 位,整数部分 M 位及 M 位内。
PS:一般来说金融计算使用浮点型会丢失精度,所以使用定点型就没有这个问题。但是, 当对精度要求不高的时候, 使用浮点型比定点型更加节约空间。 由于定点型对存储开销比之前的类型都大, 所以, 现实中很多系统使用了 INT 或 BIGINT 来存储金融数据, 单位是分,取出时除以 100 即可。
PS:定点型也支持 UNSIGNED 无符号和 ZEROFILL 填充零两个属性

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏