数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的,而且会不停地变化。数据类型的选择方面没有一个统一的标准,但是应该符合业务、项目的逻辑标准。
菜鸟教程 Mysql 数据类型
文章目录
- 1. int类型
- 2. 浮点数
- 3. 定点数
- 4. 字符串与文本类型
- 5. 枚举类型
- 6. 布尔类型
- 7. set类型(集合类型)
- 8. 时间和日期类
- 9. 内容出处
1. int类型
无符号就是unsinged属性,即一定是正数
例如:年龄一定是unsigned tinyint:因为年龄一定是正数且没有人的年龄会超过255岁
我们可以发现number这个字段的输入数据可以超过设定的宽度6(倒数第二条数据报错是因为它超过了int的范围),但是age字段的输入数据不可以超过unsigned tinyint的范围(即不能超过255)。
2. 浮点数
数据类型后面括号中第一个是总位数,第二个是小数位数
我们可以发现一旦输入数据的小数位数超过了设定的小数位数就会出现四舍五入或者精度丢失的情况。因此,除非有特殊要求,否则在mysql里浮点类型数据不是特别常用。例如:银行卡余额就不会用浮点数来存储。
问:为什么会出现精度丢失问题?
答(gpt):① 有限的位数:浮点数在计算机中通常用32位(float)或64位(double)来表示。这些位数决定了浮点数能表示的有效数字的总位数。当数值超出这个范围时,会发生舍入或精度丢失。② 二进制表示:计算机内部以二进制形式存储浮点数,而不是十进制。在转换过程中,某些十进制无法被精确地表示为二进制,因此在存储和计算时会有精度误差。③ 舍入误差:浮点数的运算涉及到四舍五入和近似值的处理,这可能会导致计算结果与期望值略有不同。
3. 定点数
问:什么叫定点数
答:它是变长的,大概每9个数字用4个字节来存储。
问:为什么它不存在精度丢失问题?
答:因为它的整数部分和小数部分是分开存的。
定点数也支持无符号的
存钱也用decimal,因为不用考虑精度丢失问题。
4. 字符串与文本类型
① C和Java中的char只能存单个字符,而mysql中的char可以存储字符串
② varchar 会回收多余的空间,且比char表示范围要大,因而推荐它
③ 但是char的效率要比varchar高
④ varchar的理论长度是65535,但是实际上它可能达不到。因为字符串字符的大小跟字符集编码有关,例如:一个汉字占2个字节,这个时候varchar可存储的数据长度就是65535除以2。如果是utf8,可能就只有2万多了,jbk可能就是32000多。
⑤ TEXT比较常用。可以用来存储博客文章等
5. 枚举类型
可以结合c语言中的枚举类型理解
① 枚举类型的另类存储方式:
枚举是通过整数进行管理的,即第一个数据’man’在存储时就是1,第二个’woman’是2,以此类推。这样可以节省字节。
② 枚举类型的好处:
节省空间、速度快(比字符串要快好多,因为它存的是数字,但是读取和显示时是字符串)、限制数据(对输入的数据进行了限制,只允许输入哪几个数据)
6. 布尔类型
7. set类型(集合类型)
一些网站点进去会让我们选择感兴趣的标签,例如:数学、天文、音乐等等。通常情况下,我们可以选择多个。这个就是用set实现的
与枚举的区别:
① 枚举类型一次只能取一个数据,set类型一次可以取多个数据
② 枚举类型数据是按1、2、3等存储;set类型分配方式是从左向右按照2的指数幂存储(8个字节是64位,因此8个字节可以保存64个选项),即2^0 、2^1 、2^2等
第一种写法报错的原因:这种写法相当于一次存了两个字段
第一种写法报错的原因:这种写法相当于一次存了三个字段,加引号也不行
8. 时间和日期类
① 规定:每张表都必须要有时间和日期类型,不过不是我们手动输入时间,而是让程序自动给
② 实际应用时datetime就行,因为这个格式非常清晰
9. 内容出处
mysql