MySQL学习笔记(二):数据类型

MySQL的数据类型还是较为简单的,总共有四种:整数类型、浮点数类型、字符串类型、时间和日期类型。

整数类型从小到大有tinyint、smallint、mediumint、int、bigint五种,区别所占空间的大小,对应为存储数据的数值大小。
拿tinyint来举例子,一个tinyint字段占一个字节Byte,即8位,8位二进制所能存储的十进制数值即2^8=256,也就是能够存储范围为-128~127(有符号),或0~255(无符号)的数。

浮点数类型有float、double和decimal,float和double都很熟悉了,主要的区别是支持的小数位和存储数值的大小。如果需要精确到小数点后10位以上,就需要选择DOUBLE类型。
不过因为十进制的小数部分化为二进制时,常常是不能化尽的,所以float和double类型都做不到精确,他们只能做到非常近似。
所以当我们对数据的精确度要求特别高时,我们就需要用到decimal类型了,因为decimal类型是将浮点数转换为字符串进行存储,所以能够解决精度问题。

字符串类型中经常使用的有char、varchar、text这三种,若需要存储少量字符串,则选择char或varchar;再根据字符串长度是否经常变化进行选择,若经常变化,则选择varchar,否则选择char。他们俩的区别是,varchar是动态分配空间,即输入多少就占多少。而char是定义多少,就占多少空间。

还有一点需要注意的是,char(n)和varchar(n)中的n表示的是字符的个数,而不是字节个数。比如说,在gbk编码的表中,一个汉字需要占2个字节;而在utf-8编码中,一个汉字需要占3个字节,而一个英文或者数字只占一个字节。但是如果一个字段的类型为char(20),则能存储20个字符,即20个中文字或英文字,或20个中英混合字。

日期和时间类型也是我们经常需要使用到的,可以用date类型表示单纯的日期,也可以用time类型表示单纯的时间(时分秒),或者用year类型只表示年份。
不过用的最多的还是datetime和timestamp,他们俩都是混合日期和时间值,区别是datetime的形式是日期字符串,而timestamp虽然表现形式是日期字符串,但是实际存储的值是时间戳;另外datetime的存储时间范围更长。

还有一点需要注意的是,就是null和空值的区别
在MySQL中,null就是在字段中存储null值,而空值是在字段中存储空字符(“)。两者是不相等的。
区别为空值是不占用空间的,而null需要占用空间。且在官方文档中有说明:
NULL columns require additional space in the row to record whether their values are NULL.
NULL列需要行中的额外空间来记录它们的值是否为NULL。

还有,当使用count统计记录数时,为null的字段会被忽略,而为空字符的字段会被统计进去。
所以我们一般会把字段加上约束-NOT NULL,或者给字段默认值、赋空字符等,避免空间的浪费。

常用的基本数据类型差不多就这些了,可以说是非常地精简,每一种数据类型都有其存在的道理,且不可被替代。不过除了以上的数据类型,MySQL中还有许多数据类型,比如 binary 二进制、blob 布尔类型、json 类型、空间数据类型(point、linestring、geometry、polygon)、enum 枚举类型、set 集合类型等等,可以满足我们的各种需要。

我们在实际地设计表结构前,需要分析数据,需要选择合适的数据类型,尽量做到不要浪费空间。

发表评论

邮箱地址不会被公开。 必填项已用*标注