来源 | 互联网全栈架构
数据类型的选择是建模过程中的关键一环,如果设计不当,就会带来很多问题,比如满足不了需求、没有扩展性、性能低下等问题。另外,做过产品研发的同学们都有切身感受,请神容易送神难,如果数据表的字段有问题,但产品已经上线且表中已经有数据了,这时候再去进行修改就会变得异常麻烦,所以在设计时就需要考虑周全。
而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就不要用INT2. 金额等对精度要求较高的场景,使用DECIMAL而不是FLOAT或者DOUBLE
3. CHAR优先于VARCHAR,而VARCHART优先于TEXT4. TIMESTAMP优于DATETIME,因为前者占用的空间更小,且存储的是UTC时间,会根据系统的时区自动进行转换。最后,在实际开发中,经常会见到这样的情况:主键使用VARCHAR来定义,对于这样的设计,你怎么看?有什么优点、缺点?