MySQL – 数据类型
文章目录
- MySQL -- 数据类型
- 一、数据类型
- 1.数据类型分类
- 2.数值类型
- 2.1.tinyint
- 2.2.bit
- 2.3小数类型
- 3.字符串类型
- 3.1.char
- 3.2.varchar
- 4.时间和日期类型
- 5.enum和set
一、数据类型
1.数据类型分类
2.数值类型
2.1.tinyint
tinyint类型的数值范围是-128 ~ 127;
可以看到越界的数值会报错,无法插入表中;
这是因为数据库内部是有约束的,符合约束条件才可以进行操作,不符合条件就无法操作;
数据类型本质就是一种约束;
在MySQL中,整形可以指定有符号和无符号的,默认是有符号的;
可以通过unsigned来说明某个字段是无符号的:
2.2.bit
bit[(M)] :位字段类型。M表示每个值的位数,范围从1到64。 如果M被忽略,默认为1。
向bit类型元素中插入数据,但是没有显示,这是因为bit字段在显示的时候,是按照ASCII码对应显示的;
2.3小数类型
- float:
float[(m,d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节;
float(4,2)表示的范围是-99.99 - 99.99,MySQL在保存值时会进行四舍五入。
多出来的部分被四舍五入了;
float还可以定义为无符号类型,使用unsigned修饰:
- decimal:
decimal (m,d)[unsigned]:定点数m指定长度,d表示小数点的位数;
decimal(5,2)表示的范围是-999.99 - 999.99;
decimal(5,2) unsigned表示的范围0 ~ 999.99;
decimal和float很像,但是有区别:float和decimal表示的精度不一样;
说明:- float表示的精度大约是7位;
- decimal精度更高,整数最大位数m为65;支持小数最大位数d是30;如果d被省略,默认为0;如果m被省略,默认是10;
3.字符串类型
3.1.char
char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255;
char(2)表示可以存放两个字符,可以是字母或汉字,但是不能超过2个,最多只能是255;
3.2.varchar
varchar(L):可变长度字符串,L表示字符长度,最大长度65535个字节;
关于varchar(len),Ien到底是多大,这个len值和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3个字节用于记录数据大小,所以说有效字节数是65532;
- 当我们的表的编码是utf8时, varchar(n)的参 数n最大值是65532/3-21844[因为utf中,-一个字符占
用3个字节],如果编码是gbk, varchar(n)的参数n最大是65532/2-32766 (因为gbk中, -一个字符
占用2字节)。
char和varchar的比较
如何选择定长和变成字符串:
- 如果数据确定长度都一样,就使用定长(char) ,比如:身份证,手机号,md5;
- 如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存的进去;
- 定长的磁盘空间比较浪费,但是效率高;
- 变长的磁盘空间比较节省,但是效率低;
- 定长的意义是,直接开辟好对应的空间;
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少;
4.时间和日期类型
date:日期 ‘yyy-m-dd’ ,占用三字节;
datetime:时间日期格式 ‘yyy-mm-dd HH : ii : ss’ 表示范围从1000到9999,占用八字节;
timestamp:时间戳,从1970年开始的 ‘yyy-mm-dd HH : ii : ss’ 格式和datetime完全一致,占用四字节;
在表中只插入了前两个数据,但是时间戳的数据也更新到的最新的时间,这是因为只要对表中的数据做增、删、改,时间戳就会自动更新到最新时间;
5.enum和set
- enum:枚举,单选类型;
enum(选项1, 选项2, 选项3…);
该设定只是提供了若干个选项的值,最终一个单元格中, 实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号; - set:集合,多选类型;
set(选项值1, 选项值2 ,选项值3, …)
该设定只是提供了若干个选项的值,最终一个单元格中, 设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是”数字",因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,最多64个。
set其实是位图类型,不是简单的数字;
使用find_in_set函数进行set的查询:
也可以通过与或级联条件进行查询;