-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathdata-type.md
More file actions
206 lines (115 loc) · 13 KB
/
data-type.md
File metadata and controls
206 lines (115 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
---
title: (付费)4000 字 20 张手绘图,结合技术派实战项目,彻底掌握 MySQL 的数据类型
shortTitle: MySQL数据类型(付费)
---
上一节,我们学了 [MySQL 表的基本操作](https://javabetter.cn/mysql/table.html),知道了表是由不同数据类型的列组成的,然后填充了一行一行的数据。
当我们要创建表的时候,就要根据业务需求,选择合适的数据类型。比如说在[技术派实战项目](https://javabetter.cn/zhishixingqiu/paicoding.html)当中,文章表就是由下面这些不同数据类型的字段定义的。

目前用到了 bigint、tinyint、varchar、int、timestamp 等数据类型,这些数据类型到底该如何选择呢?就需要我们提前先了解清楚,MySQL 到底支持哪些数据类型,以及每种数据类型的特点是什么。
## 整数类型
上面提到的 bigint、tinyint、int 都是整数类型,MySQL 支持的整数类型如下:
| 类型名称 | 存储空间 | 范围 |
| :--- | :--- | :--- |
| tinyint | 1 字节 | -128 到 127 或者 0 到 255 |
| smallint | 2 字节 | -32768 到 32767 或者 0 到 65535 |
| mediuint | 3 字节 | -8388608 到 8388607 或者 0 到 16777215 |
| int | 4 字节 | -2147483648 到 2147483647 或者 0 到 4294967295 |
| bigint | 8 字节 | -9223372036854775808 到 9223372036854775807 或者 0 到 18446744073709551615 |
smallint 和 mediuint 这两种类型很少用到,一般我们用的是 tinyint、int、bigint 这三种类型。
比如说技术派中 article 表的文章类型字段 article_type,就是用 tinyint 类型定义的,因为文章类型只有 1(博文)、2(问答)种,所以用 tinyint 就足够了。
再比如说状态 status 字段,也是用 tinyint 类型定义的,因为状态我们只有 0(未发布)、1(发布)两种。
以及 deleted 字段,也是用 tinyint 类型定义的,因为删除状态一般只有 0(未删除)、1(已删除)两种。
那像 int 一般用于用户的年龄啊、库存数量啊、评论数量啊、点赞数量啊等等。
技术派中 article 表的 offical_stat(官方推荐状态)、topping_stat(置顶状态)、cream_stat(加精状态)用了 int 类型,其实不太合理,应该用 tinyint 类型就足够了。暂时也就懒得改了。
bigint 我们用到了表的主键上,这也是一种比较常见的做法,尤其是当预计数量超过 int 的最大值(21 亿)时,但是就技术派目前的数量来看,用 int 就足够了。
我之前在做大宗期货交易的订单时,一开始用的是 int 类型,后来还真的出现了超出 int 范围的情况,所以后来改成了 bigint 类型。
bigint 的最大值是 9223372036854775807,也就是 922 亿亿,这个数字非常非常大,往往到这个数量级的都要做分库分表了。
另外,对于主键的数据类型选择,不同的业务场景有不同的需求,如果需要确保跨多个数据库或者系统唯一性,那么 UUID 或者[雪花算法](https://zhuanlan.zhihu.com/p/85837641)生成的 ID 会更合适。
UUID 不依赖于数据库的自增特性,非常适合分布式系统,但是 UUID 会占用更多的存储空间(`CHAR(36)` 或 `VARCHAR(36)`),而且不是递增的,会导致[索引](https://javabetter.cn/mysql/suoyin.html)的性能下降。
### 有符号和无符号
整型数据类型还可以选择有符号和无符号,有符号就是可以存储正数和负数,无符号就是只能存储正数。默认为有符号,也就是不用指定。
比如说 int 类型,如果是有符号的,那么范围是 -2147483648 到 2147483647,如果是无符号的,那么范围是 0 到 4294967295。

**无符号的情况下,要特别注意和 Java 数据类型的对应关系**。
我们都知道,Java 中的 [int 范围](https://javabetter.cn/basic-grammar/basic-data-type.html)是 -2147483648 到 2147483647。那如果 MySQL 选择的 int 类型是无符号的,范围就超出了 Java 的 int 类型范围了。
这时候,为了避免出现不兼容的情况,Java 的数据类型要选择 long 类型。当然了,在数据库实体(POJO)中,要用[包装类型](https://javabetter.cn/basic-extra-meal/box.html) Long。

像自增 ID,肯定是无符号的,所以我们会在定义的时候将其设置为 `unsigned`,比如说技术派项目中的 article 表。

### int(10) 和 int
注意,上图中我们在定义 id 的时候,设置的数据类型是 `int(10)`,和 int 有什么区别呢?
这其实是一道不错的面试题,比如说面试官可能会问你,`int(10)` 和 `int(11)` 有什么区别?
如果之前没有了解过的话,可能一下子就懵了。其实这个和存储空间没有关系,只是用来规定显示宽度的。
我们来创建这样一张测试表,包含四个字段,一个是主键 ID,一个是 `int(10)`,一个是 `int(11)`,另外一个是 int。
```sql
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`int10` int(10) NOT NULL,
`int11` int(11) NOT NULL,
`int` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
>这里的反引号 \` 是为了避免关键字冲突。

然后我们插入一条数据,看看结果。
```sql
INSERT INTO `test` (`int10`, `int11`, `int`) VALUES (1234567890, 1234567890, 1234567890);
```
[查询一下](https://javabetter.cn/mysql/select-simple.html),似乎没有什么区别。

我们来看一下 MySQL 官方对 `int(M)` 的解释。
> M indicates the maximum display width for integer types.
。。。。。
## 付费内容
以下内容为[二哥编程星球](https://javabetter.cn/zhishixingqiu/)的付费内容(点击[链接](](https://javabetter.cn/jvm/))可以查看详细介绍和加入方式)。

加入二哥的编程星球后,你不仅可以阅读完整版的《二哥的 MySQL 进阶之路》内容,还可以阅读更多付费专栏,比如说《[技术派付费专栏](https://javabetter.cn/zhishixingqiu/mianshi.html)》、《[二哥的 LeetCode 刷题笔记](https://paicoding.com/column/7/1)》、《编程喵实战项目笔记》、《[Java 面试指南](https://javabetter.cn/zhishixingqiu/mianshi.html)》等等。

除此之外,还可以为你提供:
- **专属的一对一提问交流**,如何准备面试,如何制定学习计划,如何选择 offer,以及职场规划,都能得到我 1v1 的指导和建议;
- **强大的嘉宾阵容**,有微信的、字节的、小米的、百度的、国企的、外企的、阿里的等等各方大佬。如果你的问题二哥解决不了,总有一个大佬能够帮你解决。
- **为你精挑细选了一些可以写到简历上,可以提高编程功底的优质实战项目**,比如说动态线程池 hippo4j、手写数据库 MYDB、Spring Boot 的前后端分离项目技术派等等,无论你是缺少项目经验的学生党,还是有一定经验的工作党,这些项目都能帮助你完成技术上的蜕变和提升。
- **星球会定期整理和分享优质的学习资料**,包括 PDF&视频教程&学习资料等等。
- **为你提供容易被忽视但又十分重要的简历指导服务**,二哥会事无巨细地帮你指出简历上的问题,打造一份投了就有声音的优质简历。
- **为你创造一个沉浸式的学习环境**,二哥的编程星球自上线以来,氛围非常好,有一种高中初中上晚自习,大学进图书馆的感觉,每天都会有很多球友积极打卡,分享自己一天的学习成果。
学习的路上最缺的就是清晰的学习路线、优质的学习资料和良好的学习氛围,二哥的编程星球恰好就能给你提供这样的服务。来星球的球友几乎都斩获不错的成绩,有美团、华为等大厂,也有 16k 的双非本、甚至 23k 的大专社招,我随便发几个球友报喜的截图给大家展示下。


《[Java 面试指南](https://javabetter.cn/zhishixingqiu/mianshi.html)》是[二哥编程星球的](https://javabetter.cn/zhishixingqiu/)的一个付费专栏,和《Java 进阶之路》上的内容可以形成很好的互补,截止到目前,已经更新 48 万字,可以说是满满的干货和诚意。

一共分为 6 大板块,对面试、职场、技术、学习都会帮助特别大。
- 面试准备篇(25+篇),手把手教你如何准备面试。
- 职场修炼篇(11+篇),手摸手教你如何在职场中如鱼得水。
- 学习路线篇(13+篇),手勾手教你如何快速学习一门技术栈。
- 技术提升篇(33+篇),手拉手教你如何成为团队不可或缺的技术攻坚小能手。
- 面经分享篇(23+篇),手牵手教你如何在面试中知彼知己,百战不殆。
- 场景设计篇(22+篇),手握手教你如何在面试中脱颖而出。
### 01、面试准备篇
所谓临阵磨枪,不快也光。更何况提前做好充足的准备呢?这 25+篇内容会系统地引导你该如何做好面试准备。涉及到的主题有:简历、源码、LeetCode、项目经验、开源项目、高并发、证书、和 HR 对线、国企名单、公司投递名单、银行、谈薪等等面试常见问题。



### 02、职场修炼篇
如何平滑度过试用期?如何平滑度过 35 岁程序员危机?如何在繁重的工作中持续成长?如何做副业?如何赚零花钱?如何达到 30 万+年薪等等,都是大家迫切关心的问题,这 11+篇内容会一一为你揭晓答案。

### 03、技术提升篇
编程能力、技术功底,是我们程序员安身立命之本,是我们求职/工作的最核心的武器。

### 04、面经分享篇
知彼知己,方能百战不殆,我们必须得站在前辈的肩膀上,才能走得更远更快。他们在面试中遇到过哪些经典的问题,我们能不能提前演练一下,对临场发挥有着至关重要的作用。

### 05、场景设计题篇
有些面试官不喜欢问八股文,反而更喜欢结合项目问一些非常经典的场景题,这种场景题没有标准的答案,但却很能考察一名求职者的逻辑思维能力。

## 星球限时优惠
一年前,星球的定价还是 99 元一年,第一批优惠券的额度是 30 元,等于说 69 元的低价就可以加入,再扣除掉星球手续费,几乎就是纯粹做公益。
随着时间的推移,星球积累的干货/资源越来越多,我花在星球上的时间也越来越多,[星球的知识图谱](https://javabetter.cn/zhishixingqiu/map.html)里沉淀的问题,你可以戳这个[链接](https://javabetter.cn/zhishixingqiu/map.html)去感受一下。有学习计划啊、有学生党秋招&春招&offer选择&考研&实习&专升本&培训班的问题啊、有工作党方向选择&转行&求职&职业规划的问题啊,还有大大小小的技术细节,我都竭尽全力去帮助球友,并且得到了球友的认可和尊重。
目前星球已经 5000+ 人了,所以星球也涨价到了 149 元,后续会讲星球的价格调整为 159 元/年,所以想加入的小伙伴一定要趁早。

你可以微信扫码或者长按自动识别领取 30 元优惠券,**119/年** 加入,新项目 pmhub 上线后会涨价至 159 元,所以想要加入的话请趁早。

对了,**加入星球后记得花 10 分钟时间看一下星球的两个置顶贴,你会发现物超所值**!
成功没有一蹴而就,没有一飞冲天,但只要你能够一步一个脚印,就能取得你心满意足的好结果,请给自己一个机会!
最后,把二哥的座右铭送给你:**没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟**。
共勉 ⛽️。