mysql提供了整数类型、浮点数类型、日期和时间类型、字符串类型等。
1、整数类型
TINYINT
(1个字节)
SMALLINT
(2个字节)
MEDIUMINT
(3个字节)
INT
和INTEGER
(4个字节)
BIGINT
(8个字节)
2、浮点数、位类型
FLOAT
(4个字节)
DOUBLE
(8个字节)
- 如果要存储小数类型,可以选择float或者double, 具体选择哪一个,则需要判断小数需要精确到小数点后多少位,如果超过10位就要选择double,其余情况选择float位类型 MySQL提供了允许您存储位值的BIT类型。BIT(m)可以存储多达m位的值,m的范围在1到64之间。
- 位类型用的最多的是用于表示 true和false两种情况的场景 可以使用BIT(1) 可以最大限度降低存储空间的浪费,实际开发中有很多信息都是这种类型,比如 is_vip表示是否是vip用户等
3、时间和日期
YEAR
,字节数为1,取值范围为“1901——2155”
DATE
,字节数为4,取值范围为“1000-01-01——9999-12-31”
TIME
,字节数为3,取值范围为“-838:59:59——838:59:59”
DATETIME
,字节数为8,取值范围为“1000-01-01 00:00:00——9999-12-31 23:59:59”
TIMESTAMP
,字节数为4,取值范围为“19700101080001——20380119111407”
当插入值超出有效取值范围时,系统会报错,并将零值插入到数据库中。
- 如果只要表示年月日,比如生日 使用DATE类型
- 如果要表示年月日时分秒,比如用户注册时间,使用DATETIME类型
- 如果需要经常插入或者更新日期为当前系统时间,使用TIMESTAMP
- 如果只需要时分秒,一般使用TIME类型 ‐ 比如跑步记时
- 如果只需要年份 可以使用YEAR,因为该类型比DATE类型更省空间
- 如果系统是一个全球化的系统。不同的时间需要在不同的地方显示成当地的时间则需要TIMESTAMP类型
4、字符串类型
- char系列字符串
CHAR(M)
0~255之间的整数
VARCHAR(M)
0~65535之间的整数
字符串类型CHAR的字节数是M, 例如CHAR(4)的数据类型为CHAR,其最大长度为4,VARCHAR类型的长度是可变的 具体选择哪一个需要判断所存储字符串长度是否经常变化,如果经常发生变化,则可以选择varchar类型。否则选择char类型。 - text系列字符串
TINYTEXT
0~255
TEXT
0~65535
MEDIUMTEXT
0~167772150
LONGTEXT
0~4294967295
如果需要存储大量字符串,可以选择text类型字符串, 至于是选择这些类型中的哪一种,则需要判断所存储字符串长度,根据存储字符的长度来决定是选择允许长度最小的tinytext字符串类型,还是选择允许长度最大的longtext字符串类型。 - char,varchar和text的区别
在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。
存储方式和数据的检索方式也都不一样:
数据的检索效率是:char > varchar > text
- char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格。
- varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
- text:存储可变长度的非Unicode数据,最大长度为2^31‐1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
结论:
1、经常变化的字段用varchar;
2、知道固定长度的用char; ‐ 身份证
3、超过255字节的只能用varchar或者text;
4、能用varchar的地方不用text;
5、能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能, 并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;