Py学习  »  DATABASE

初出茅庐的00后程序员大放厥词:现在都AI时代了,还去学习什么MySQL的数据类型,简直是浪费时间!老码农反唇相讥:基础不牢,地动山摇!

脚本之家 • 10 小时前 • 15 次点击  
将 脚本之家 设为“星标⭐”
第一时间收到文章更新
图片

来源 | 互联网全栈架构

数据类型的选择是建模过程中的关键一环,如果设计不当,就会带来很多问题,比如满足不了需求、没有扩展性、性能低下等问题。另外,做过产品研发的同学们都有切身感受,请神容易送神难,如果数据表的字段有问题,但产品已经上线且表中已经有数据了,这时候再去进行修改就会变得异常麻烦,所以在设计时就需要考虑周全。

而MySQL提供了丰富的数据类型,包括数值类型、日期和时间类型、字符串类型,以及其他一些特殊的类型。

一

数值类型

数值类型主要包括整数类型、浮点数类型、定点数类型。
1. 整数类型,主要包括:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT:
图片
MySQL可以指定整数类型是否有符号,默认是有符号的,可以通过关键字UNSIGNED来说明字段是无符号的,这样的话,最大值就翻倍了,比如SMALLINT,有符号的最大值是32767,而无符号的最大值为65535。
2. 浮点数类型,包括:FLOAT、DOUBLE,它们属于浮点数据类型,用于存储近似值,FLOAT是单精度(single-precision)浮点类型,占用4个字节,32位,DOUBLE是双精度(double-precision)浮点类型,占用8个字节,64位。
由于浮点类型存储的是近似值,如果对于计算精度要求较高,比如财务系统中的金额,建议不要采用浮点类型。那么,在实际的项目开发中,对于这种金额相关的数值,一般采用什么数据类型来保存?欢迎留言讨论。
3. 定点数类型,DECIMAL,它用于保存精确值,既可以保存整数,也可以保存小数。可以指定它的精度和小数位数,比如DECIMAL(5,2),它表示可以存储五位数,小数可以为两位,所以它的取值范围为-999.99至999.99。
另外,NUMERIC也用于存储数据数值,它的作用和使用方法与DECIMAL是一样,底层使用DECIMAL来实现,所以它们是可以互相替换的。

二

日期和时间类型

日期时间类型主要包括:DATE、DATETIME、TIMESTAMP、TIME、YEAR。
图片
关于TIME类型,它的取值范围是'-838:59:59'至 '838:59:59',这个小时数看起来很大啊,838,远大于我们理解的24小时,这是什么原因呢?

三

字符串类型

字符串类型主要包括文本字符串、二进制字符串、枚举类型。
1. 文本字符串,最常见的是CHAR和VARCHAR,以及TEXT,而TEXT又细分为TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。
图片
CHAR和VARCHAR可能是最常用的字符串类型了,它们的主要区别在于长度是否可变。比如CHAR(4),不管最终保存了几个字符,它占用的空间都是4个字节,而VARCHAR(4)则不一样,如果最终只保存了一个字符,那么它占用2个字节的空间(实际字符数+1)。当然,实际情况跟SQL MODE和尾部空格是否保留有关。
2. 二进制字符串,主要包括BINARY、VARBINARY,以及BLOB,而BLOB可以细分为TINYBLOB、BLOB、MEDIUMBLOB和 LONGBLOB。二进制字符串类型主要用于存储二进制数据,比如图片、音频、视频等。因为是以二进制的形式保存,所以进行比较和排序时,它们是大小写敏感的。
3. 枚举类型,主要包括ENUM和SET。它们主要用于存储有给定值的可选字符,类似表单中单选或者多选。ENUM的值数量是固定的,在创建时就已经指定了,且为单选,而SET可以多选,这是两者的主要区别。

四

小结

以上就是MySQL的常用数据类型,除此之外,MySQL还提供了空间数据类型、JSON等,具体使用方法可以参见官方网站。另外,在选择数据类型的时候,也有一些基本的原则和最佳实践,比如:
1. 尽量选择空间小的类型,比如整数,能用TINYINT就不要用SMALLINT,能用MEDIUMTINT就不要用INT
2. 金额等对精度要求较高的场景,使用DECIMAL而不是FLOAT或者DOUBLE
3. CHAR优先于VARCHAR,而VARCHART优先于TEXT
4. TIMESTAMP优于DATETIME,因为前者占用的空间更小,且存储的是UTC时间,会根据系统的时区自动进行转换。
最后,在实际开发中,经常会见到这样的情况:主键使用VARCHAR来定义,对于这样的设计,你怎么看?有什么优点、缺点?
图片
  推荐阅读:
  1. 吴恩达直言不怀念亲手写代码:Coding Agent用法三个月变一轮,但工程判断力没那么快过时,会用Agent只是第三项能力
  2. 上午面试结束,下午给候选人发offer,晚上就被拒了,原因是他看到部门负责人的朋友圈全是凌晨下班的小作文。
  3. Stack Overflow 时代落幕!月增提问不足 1000,爆降 99.3%
  4. 大厂明面上取消"35岁裁员",面试时却问"愿意接受比你小10岁的领导吗",我该怎么回答?
  5. 中国的程序员群体是否已经过多了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/203204