3

说明:本文是作者对MySQL数据库数据存储类型的小小总结。

Numeric Type (数字类型)

1、TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
主要根据存储字节长度不一样划分:

  • TINYINT:1字节

  • SMALLINT:2字节

  • MEDIUMINT:3字节

  • INT:4字节

  • BIGINT:8字节

如果不需要符号数时,建议加上unsigned,会扩充存储长度一倍,提高存储性能。如TINYINT UNSIGNED(0~255)/TINYINT(-128~127)。

2、DECIMAL/NUMERIC
DECIMAL与NUMERIC一样,二进制形式存储数字类型,如DECIMAL(4,2)表示存储一个小数点后两位总共4位精度的数字,范围是-99.99~99.99。总位数最大数字是65。

3、FLOAT和DOUBLE
FLOAT是4字节存储,DOUBLE双精度是8字节存储。FLOAT(6,4)表示存储一个小数点后四位总共6位精度的数字,如果小数位有超出则四舍五入。如把99.0000990存进去,则实际上存的是99.0001,这会让数字失真,所以对于银行账号金额要求高精度的,则可以换成双精度来存储,或者对原数字小数点左移存储。

String Type (字符类型)

1、CHAR和VARCHAR
CHAR是固定字符长度,且最大字符长度为255=2e8-1,处理速度比VARCHAR快,但容易浪费存储空间。如CHAR(10)表示固定分配10个字符长度存储空间,当存储'PHP'时,就浪费了7个字符长度的存储空间。对于字符后尾的空格,CHAR需要做处理。
VARCHAR是可变长度,根据字符实际长度分配存储空间,最大字符长度为65535=2e16-1。VARCHAR(10)表示最大存储10个字符长度的字符串,存储'PHP'时只分配3个存储空间,节约存储空间。
默认使用InnoDB引擎时,使用VARCHAR比较好。一般用VARCHAR类型比较多。

2、BINARY和VARBINARY
BINARY/VARBINARYCHAR/VARCHAR类似,只不过BINARY/VARBINARY存储的是二进制字符,长度也表示字节长度而不是字符长度(ASCII编码一个英文字母1个字节一个汉字2个字节;UTF-8编码一个英文字母1个字节一个汉字3个字节)。

3、BLOB和TEXT
BLOB存储大数据量的二进制数据,比如一张图片。BLOB分为:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,根据存储字节最大长度分类。
TEXT存储大数据量的字符串数据,TEXT分为:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,根据存储文本最大长度分类。

4、ENUM
枚举类型,每一个值都有对应的索引index。最大两个字节存储,65535个不同成员。注意的是:
表中字段:numbers ('0', '1', '2')
insert into test(numbers) values (2),('2'),('3');
select * from test;
会返回:
numbers

  • 1

  • 2

  • 2

这说明,存储整形2时把2当做索引存的是第二个值'1',存储字符'2'时就是字符'2',存储字符'3'时把'3'当做索引3,存的是'2'。

5、SET
集合类型,与ENU类似,最多包含64个成员。

CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
SELECT * FROM myset;

会顾虑掉重复数据:
图片描述

Date and Time Type (日期和时间类型)

DATE、TIME、DATETIME、TIMESTAMP、YEAR
默认格式为:

  • DATE: 1000-01-01 ~ 9999-12-31

  • TIME: 00:00:01 ~ 23:59:59

  • DATETIME: 1000-01-01 00:00:00 ~ 9999-12-31 59:59:59

  • TIMESTAMP: 1970-00-01 00:00:00 ~ 2038-01-19 03:14:07

  • YEAR: 0001 ~ 9999

其中,比较方便的一个是timestamp,它可以根据时区不同进行转换,很好用。

欢迎关注Laravel-China

RightCapital招聘Laravel DevOps


lx1036
3.1k 声望923 粉丝

为五斗米折腰