MySQL 数字类型的设计
在进行表结构设计时,数字类型是最为常见的类型之一,但要用好数字类型并不如想象得那么简单,比如:
-
怎么设计一个互联网海量并发业务的自增主键?用 INT 就够了?
-
怎么设计账户的余额?用 DECIMAL 类型就万无一失了吗?
以上全错!
数字类型看似简单,但在表结构架构设计中很容易出现上述“设计上思考不全面”的问题(特别是在海量并发的互联网场景下)。所以我将从业务架构设计的角度带你深入了解数字类型的使用,期待你学完后,能真正用好 MySQL 的数字类型(整型类型、浮点类型和高精度型)。
数字类型
整型类型
MySQL 数据库支持 SQL 标准支持的整型类型:INT、SMALLINT。此外,MySQL 数据库也支持诸如 TINYINT、MEDIUMINT 和 BIGINT 整型类型(表 1 显示了各种整型所占用的存储空间及取值范围):
各 INT 类型的取值范围
在整型类型中,有 signed 和 unsigned 属性,其表示的是整型的取值范围,默认为 signed。在设计时,我不建议你刻意去用 unsigned 属性,因为在做一些数据分析时,SQL 可能返回的结果并不是想要得到的结果。
来看一个“销售表 sale”的例子,其表结构和数据如下。这里要特别注意,列 sale_count 用到的是 unsigned 属性(即设计时希望列存储的数值大于等于 0):
mysql> SHOW CREATE TABLE saleG
*************************** 1. row ***************************
Table: sale
Create Table: CREATE TABLE `sale` (
`sale_date` date NOT NULL,
`sale_count` int unsigned DEFAULT NULL,
PRIMARY KEY (`sale_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)
<p>mysql> SELECT * FROM sale;<br>
±-----------±-----------+
<br>
| sale_date | sale_count |
<br>
±-----------±-----------+
<br>
| 2020-01-01 | 10000 |
<br>
| 2020-02-01 | 8000 |
<br>
| 2020-03-01 | 12000 |
<br>
| 2020-04-01 | 9000 |
<br>
| 2020-05-01 | 10000 |
<br>
| 2020-06-01 | 18000 |
<br>
±-----------±-----------+
<br>
6 rows in set (0.00 sec)
<br>
</p>