简介
想写本篇博客,是因为发现了mysql的数据类型非常的多。但是,其中的差异,为什么要用这样的数据类型,大多数人是没有去仔细了解的。所以,自己对这方面有点好奇,去学习了一下。笔记如下:
mysql常见数据类型
数值类型
- int:int最大长度是11位。从 -2^31 (-2,147,483,648) ^^到 2^31 - 1 (2,147,483,647)^ 的整型数据(所有数字)。存储大小为bai 4 个字节。11也是int类型的最大长度,其中第一位表示符号+或者-,后面十位表示数字。 所以,如果指定了长度,该字段其实也是长度为11的字段,因为只要是int类型,系统都分配了长度11位。那么指定哪个长度的意义其实是:显示位数。就是你存储的结果本质是11位,只不过可视化看起来不是而已。
- bigint:存储大小为 8 个字节。
- mediumint:存储大小为 3 个字节。
- smallint:存储大小为 2 个字节。
- tinyint:存储大小为 1 个字节。
- decimal: 是小数,在建表的时候可以指定存入的小数格式,如:decimal(p,d),就是整数保留p位,小数保留小数点后d位。注意:
- P是表示有效数字数的精度。 P范围为1〜65。
- D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
- set:建表的时候设定好了set值,而后存储的时候,只能存储固定的几个set值中的一个。类似java中的枚举了。用法的话:你可以通过1,2,4,8,16这样的“下标”来指定,你需要存入的数据。话不多说,直接看例子:
-- 首先建表
create table set_table(
id int auto_increment primary key,
hobby set('music','movie','swimming','footbal')
);
-- 然后执行插入
insert into set_table(id,hobby) values(null,1); -- 相当于插入了“music”
insert into set_table(id,hobby) values(null,2); -- 相当于插入了“movie”
insert into set_table(id,hobby) values(null,3); -- 相当于插入了“music,movie”
insert into set_table(id,hobby) values(null,4); -- 相当于插入了“swimming”
insert into set_table(id,hobby) values(null,8); -- 相当于插入了“footbal”
-- 由上面可以看出,我们建表的时候,新建的set,4个数据('music','movie','swimming','footbal')对应的下标是:(1,2,4,8)来着。当你插入数据为3的时候,会插入1+2,既:“music,movie”
-- 这样子,我们插入的数据是特定的,并且可以方便的插入多个字符组合成的一个字符串到指定字段中。
-- 然后是查询
SELECT * FROM set_table WHERE FIND_IN_SET('movie',hobby)>0; -- 这样是利用了sql函数FIND_IN_SET(),可以找出指定的set字段hobby内,包含了movie的行。
SELECT * FROM set_table WHERE hobby & 4; -- 这样是把hobby 内,存储了下标为4的值的行都筛选出来。
SELECT * FROM set_table WHERE hobby LIKE '%m%'; -- 这个就是把hobby 字段里面的值当做了字符串,倒是没有啥好说的。
SELECT * FROM set_table WHERE hobby = 'music,movie'; -- 这个就是把hobby 字段里面的值当做了字符串,倒是没有啥好说的。
- enum:枚举类型,在设定表的时候,指定字段的枚举值。然后插入的时候,就可以用1,2,3,4等下标来表示要插入的值了,在查询的时候也是如此,参考上面的set。很类似:
-- 首先建表
create table set_table(
id int auto_increment primary key,
emuns enum('北京','上海','广州','深圳')
);
-- 然后执行插入
insert into set_table(id,enums) values(null,1); -- 相当于插入了“北京”
insert into set_table(id,enums) values(null,2); -- 相当于插入了“上海”
insert into set_table(id,enums) values(null,3); -- 相当于插入了“广州”
insert into set_table(id,enums) values(null,4); -- 相当于插入了“深圳”
insert into set_table(id,enums) values(null,5); -- 报错
-- 由上面可以看出,我们建表的时候,新建的enum,4个数据('北京','上海','广州','深圳')对应的下标是:(1,2,3,4)来着。当你插入数据为3的时候,会插入‘广州’
-- 然后是查询
SELECT * FROM set_table WHERE enums=2; -- 查询出下标为2的数据,上海。
9. 浮点:float和double
字符类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
- char:普通字符串存储,用它就好了。注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
- varchar:变长字符串,和char的区别在于,字符如果很短,他占用的空间会缩短,而不是char那种,后面有空格也不理的定长字符串。充分利用磁盘空间
- blob:存储的是二进制的字节串,而不是字符了,可以容纳可变数量的数据,有tiny,small,medium和long几个级别。
- text:存储的是长文本,和char类似了,也有tiny,small,medium和long
ll,medium和long几个级别
时间类型
- DATETIME:数据格式为2020-11-05
- DATE: 数据格式为2020-11-05
- TIMESTAMP: 为一个数字:12392373485.是和1970年到现在的毫秒数。
- TIME:数据格式为000:00:00
- YEAR:数据格式为0223,
空间数据类型
这个的话,是mysql为了地理啊,数学啊,之类的数据提供支持而设定的,主要包括:
- Point
字段类型: point
样例: Point(1 1) - MultiPoint
字段类型: multipoint
样例: MULTIPOINT (1 1,2 2,3 3) - LineString
字段类型: linestring
样例: LINESTRING(1 1,2 2,3 3) - MultiLineString
字段类型: multilinestring
样例: MULTILINESTRING ((1 1,2 2,3 3),(2 2,2 3,2 4)) - Polygon
字段类型: polygon
样例:
单面 POLYGON((1 1,1 2,2 2,2 1,1 1)) - MultiPolygon
字段类型: multipolygon
样例: MULTIPOLYGON(((1 1,1 2,2 2,2 1,1 1)),((2 2,2 3,3 2,2 2)))
里面是多个polygon
这些数据可视化后是这个样子的:
参考:
7. Mysql之空间几何对象数据
8. MYSQL空间几何对象
9. mysql数据库 geometry, point, polygon类型,地理空间数据库查询操作