数据类型对于数据库的性能是有一定的影响的,如果一个数值采用的不恰当的数据类型,那么将会导致数据库性能下降。这里先提到一点,我也是刚学,后面具体在分解其中缘由。
Mysql支持SQL的所有类型,分为数值类型,字符串类型,还有日期类型及其他类型。我们先来看看数值类型。数值类型和我们写代码中常用的int,long,float,double差不多。int分了多种类型,其中数值正是根据有无符号来决定的。
比如TINYINT的无符号取值范围就是,2的七次方减1,无符号就是2的8次方减1。
在计算机上有符号类型的,存在正0和负0的表示,如8位的int 第一位为符号位,负零=10000000,正零为00000000,为了约定,在超过01111111,溢出时就会变成负零,所以为了不浪费这种表示,特地约定负0表示一个2的七次方的一个负数。其他16位,24位和32位的道理是一样的。
类型 | 解释 | 大小 | 范围(有符号) | 无符号 | 用途 |
TINYINT | 最小的int类型 | 1字节,8位 | (-128,127) | (0,255) | 小整数类型 |
SMALLINT | 比较小的int类型 | 2字节,16位 | (-32768,32767) | (0,65535) | 略小的int类型数值 |
MEDIUMINT | 较小的int类型 | 3字节,24位 | (-8 388 608,8 388 607) | (0,16 777 215) | 较小的int类型 |
INT或INTEGER | 一般的int类型 | 4字节,32位 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 一般的int类型 |
BIGINT | 长整数型 | 8字节,64位 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 长整数 |
FLOAT | 浮点数 | 4字节,32位 | 纠结浮点数的大小意义不大 | 纠结浮点数的大小意义不大 | 单精度 |
DOUBLE | 双精度浮点 | 8字节,64位 | 纠结浮点数的大小意义不大 | 纠结浮点数的大小意义不大 | 双精度 |
DECIMAL | 小数值 | 对DECIMAL(M,D) M>D,为M+2 | 一般的D是不允许大于M的,不同的mysql版本会有所不同,但总之依赖于M和D的大小 | 依赖于M和D的值 | 小数值 |
这里除了几个int类型我们不太常见以外,还有就是DECIMAL。这是一个专门用来表示小数的特定类型。
一般定义时需要指定M和D。此类型是在MySql5.1的版本中开始引入。M表示这个小数一共可以存储多少个位,包含小数部分。D表示小数部分的位数,是十进制的位数。
如DECIMAL(2,1) 代表就是一个最大值是10,小数部分只有一位的小数,那这个数的最大值就是9.9。NUMERIC与DECIMAL同以,一般会默认转成decimal。通常用来表示货币,此类型要比float和double更为精准。超过存储范围会报错!
- M是最大位数(精度),范围是1到65。可不指定,默认值是10。
- D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
字符类型:
类型 | 解释 | 大小 | 用途 |
---|---|---|---|
CHAR | 一般短的字符 | 0-255 bytes | 定长字符串 |
VARCHAR | 一般的较长的字符 | 0-65535 bytes | 变长字符串 |
TINYBLOB | 较小的BOLB字符 | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 较小的文本类型 | 0-255 bytes | 短文本字符串 |
BLOB | 一般的BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 文本类型 | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 中等的BLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 中等长度的TEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 超长B,LOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 超长TEXT | 0-4 294 967 295 bytes | 极大文本数据 |
文本类型可以分为三类,char,text,BOLB。char和varchar在有些数据库引擎上区别比较大,在mysql的InnoDB中我们一般都采用varchar。两者的区别是,char是固定长度,会造成空间浪费,但是检索速度会比较快,对尾部空格的处理会丢失。现在varchar的优化效率也不错,在InnoDB的数据库引擎中,一般都采用varchar代替char。
TEXT主要用来存储长文本数据,如一大段的商品描述,比较长的公告等等。其最大长度是65535BIT,也就是接近0.06M的存储空间了。
1KB=1024B;1MB=1024KB=1024×1024B。
1B(byte,字节)= 8 bit(见下文);
1KB=1024B= 2^10 B;
BLOB主要是二进制的文本数据类型,如图片音频,视频文件等多媒体文件。
日期和时间类型:
类型 | 解释 | 大小 | 格式 | 范围 | 用途 |
---|---|---|---|---|---|
DATE | 日期,年月日 | 3个字节 | 2020-05-11 | 1000-01-01到9999-12-31 | 只存储日期,年月日,多余的都会被自动截掉 |
TIME | 时间,时分秒 | 3个字节 | 14:05:34 | -838:59:59到838:59:59 | 只存储时间,时分秒,其余会被截掉 |
YEAR | 年份 | 1个字节 | 2020 | 1901=2155 | 存储年份 |
DATETIME | 年月日时分秒 | 8个字节 | 2020-05-11 14:05:34 | 1000-01-01 00:00:00到9999-12-31 23:59:59 | 日期时间混合 |
TIMESTAMP | 时间戳 | 4个字节 | 2020-05-11 14:05:34 | 1970-01-01 00:00:00 到 2037-12-31 23:59:59 | 混合日期二时间戳 |
这里的DateTime和Java里边的Date类是一致的。这里最主要的两个区别是DATETIME和TIMESTAMP两者的区别。两者范围不同,存储空间不同,索引速度也不相同,TIMESTAMP要不DATETIME快一些,比较轻便。另外DATETIME不会随着时区变化而变化,是绝对时间。还有从表中可以看出,TIMESTAMP的时间范围比较小!
而且一般的数据库函数比如,NOW()获取当前时间的格式都是DATETIME,可以直接获取函数写入当前时间,一般写入数据库时间类型,多用此类型。