前言
对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。
本章从MySQL中的常用类型出发,结合类型选择的常见错误,贯彻MySQL的常用类型选择。
常用类型
MySQL的常用类型并不多,总的来说分为以下几种:
- 整数类型
- 实数类型
- 字符串类型
- 日期和时间类型
整数类型
存储整数的话,可以用以下几种数据类型进行表示:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别使用8,16,24,32,64位进行存储。
同时还可以设置UNSIGEND,将大小扩大一倍。
很多有些基础的同学可能会疑惑,比如我们要进行数值之间的计算,如果进行类型转换函数进行转换,那么我们就用不了索引了,性能会极其低下。
其实MySQL中的整数类型,它只代表其硬盘和内存中是如何存储数据的,整数计算中,通常都是使用64位的BIGINT进行运行,包括32位环境亦是如此。
实数类型
实数类型我认为一般来说有三种:float,double,decimal,其中有C语言经验或者Java语言经验的同学应该知道,float和double在很多类型的编程语言中属于基本数据类型中的浮点型。由于操作系统的限制,计算机表示浮点型存在极大的缺陷,会有很大的精度误差。所以在**《阿里巴巴Java开发手册》**的MySQL部分以及MySQL的官方推荐中,都是强烈建议如果需要完全精确的小数的话,使用decimal进行存储。
所以我认为的话,如果是正常的开发中,所有的小数都使用decimal为好。
字符串类型
无论是哪一种基础设施或者语言,字符串都是其中避不开的一讲,MySQL中关于字符串的类型有:VARCHAR,CHAR,BLOB,TEXT,我在写项目的过程中使用的最多的便是VARCHAR,VARCHAR相当于是没有限制字符串长度的,而CHAR限制了字符串的长度,会丢弃多余的字符。CHAR适合存储定长或者或者很短的数据,比如MD5值和是非(Y,N)。
而BLOB和TEXT我就不是特别的熟悉了,按照《高性能MySQL》来说的话,这两种都是用来存储很大的数据而设计的,其中BLOB以二进制存储,TEXT以字符存储,在存储的时候,作为对象来存储。
日期类型
主要的日期类型:date,datetime,timestamp,time
类型 | 大小(byte) | 范围 | 格式 | 样例 |
---|---|---|---|---|
year | 1 | 1901~2155 | YYYY | 2021 |
date | 3 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 2021-05-30 |
time | 3 | ‘-838:59:59’/‘838:59:59’ | MM-DD:SS | 23:30:00 |
timestamp | 4 | 1970-01-01 00:00:00UTC~2038……时间,根据时区不同而不同,结束时间为2147483647秒 | YYYYMMDDHHMMSS | 2021-05-30 12:30:12 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 2040-05-20 13:14:00 |
日期类型注意点
- time类型小时部分如此大的原因是因为其不止可以表示一天的时间(小于24小时),还可以是某个事件过去的时间,或者两个事件之间的时间间隔。
- timestamp与datetime显示格式相同,但是其合法范围不同,timestamp插入的时候会先转为UTC(时间统一时间),取出的时候在转成当地时区时间。
- MySQL允许不严格语法,任何标点符号都可以作为日期部分之间的分隔符。
类型选择中的常见错误
- 字段使用varchar,但是语句中使用整数类型;或者字段中使用整数类型,语句中使用字符串类型;这样执行的SQL语句不会走索引,而会走全表。
- 在不同的表中,表示同一个含义的字段使用不同的数据类型连接,这样也会导致可能的性能问题。