一、Mysql常用的数据类型
整数类型 | 浮点数类型 | 字符串类型 | 日期类型 |
---|---|---|---|
bit、bool、tinyint、smallint、mediumint、int、bigint | float、double、decimal | char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext | Data、DataTime、TimeStamp、Time、Year |
- 其他数据类型:用的比较少,暂不介绍
-----------------------------------------------------------------------------------------------------
- 整型类型
上表说明:[]包含的内容是可选的,默认是 有符号类型,无符号类型需要在后面跟上 unsigned
- 示例1:有符号类型
demo1表中c1字段为 tinyint有符号类型 ,插入数值在范围之内便可成功插入;不在范围之内便会报错。
但是,这个需要去 my.ini脚本文件 设置一个mysql自带的变量:sql_mode=STRICT_ALL_TABLES。如果不设置这个字段,当我们插入的数值超出范围时,数据库会自动默认该插入的数值为此数据类型的最大值或最小值。
关于数值对应的范围计算方式属于计算机基础的一些知识,可以去网上或书上查阅相关资料。
- 示例2:有符号类型
在demo2表中,c1是 tinyint的无符号类型,插入负数会报错。
- 类型(n)说明
在开发中,我们会碰到有些定义整型的写法是int(11),这种写法根据大佬的描述,他在开发中认为这个暂时没有什么用途,不过还是说一下,int(n)我们只需要记住两点:
- 无论n等于多少,int永远占4个字节
- n表示的是显示宽度,不足的用0补齐,超过的无视长度而直接显示整个数字,但这要整型设置了
unsigned zerofill 才有效
具体请看下图:
根据上面图片所示:当我们输入:show create table demo3; ,输出了表demo3的创建语句,通过对比我们发现和我们原始创建表的语句不一样。
- a字段,开始int没有给定长度,输出后发现,长度变成了11;
- d字段,开始为 有符号类型(默认的) 和 zerofill,输出后发现,类型变成了 无符号类型(默认的) 和 zerofill。说明 zerofill 会自动将无符号类型转变为有符号类型。
- f和g字段,开始int没有给定长度,类型为 zerofill,输出后发现,长度变成了10
说明:
int(5)输出宽度不满5时,前面用0来进行填充;
int(n)中的n省略的时候,宽度为对应的类型无符号最大值的十进制的长度,如bigint无符号最大值为2的64次方-1等于18,446,744,073,709,551,615;长度为20,那么设置了zerofill后,不足这个长度的,前面自动补0,直至到20位。
上面的结果中1前面补了19个0,和期望的结果一致。
-----------------------------------------------------------------------------------------------------
- 浮点类型
- float数值类型用于表示单精度浮点数值;
- double数值类型用于表示双精度浮点数值;
- float和double都是浮点型,而decimal是定点型
浮点型和定点型可以用类型名称后加(M, D)来表示,M表示该值的总长度(包括小数点),D表示小数点后面的长度,M和D又称为精度和标度。
float和double在不指定精度时,默认会按照实际的精度来显示,而decimal在不指定精度时,默认整数为10,小数为0。
- 示例1(重点):有精度和标度
结果说明(注意看):
c是decimal类型,认真看一下输入和输出,发现 decimal采用的是:四舍五入
a和b分别是float和double类型,观察其输出,发现它们俩都是采用:四舍六入五成双
decimal插入的数据超过精度之后会触发警告
- 四舍六入五成双
在精度范围内,末尾的数<5则舍弃;>5则进位。如果需要处理的数字是5,首先看5后面是否还有没有不为0的任何数字,如果有,则直接进位;如果没有,则需要看5前面的数字,若是奇数则进位,否则将5舍掉。
- 示例2:无精度和标度
a和b的数据正确插入,而c被截断了;
浮点数float、double如果不写精度和标度,则会按照实际显示;
decimal不写精度和标度,小数点后面会进行:四舍五入,并且插入时会有警告!
再看看下面的代码段:
从上面的sum的结果可以看出来float、double会存在精度问题,decimal精度正常。
对于这种小数点的数值,根据业务需求选择。如果是银行系统,要求精准度高,建议使用decimal
-----------------------------------------------------------------------------------------------------
- 日期类型
-----------------------------------------------------------------------------------------------------
-
字符串类型
-
char类型占用固定长度,如果存放的数据为固定长度的建议使用char类型,如:手机号码、身份证等固定长度的信息;
-
表格中的L表示存储的数据本身占用的字节,L以外所需的额外字节为存放该值的长度所需的字节数;(例如L+2,L为存储数据本身占用的字节,2为额外字节用于存放该值的长度)
-
Mysql通过存储值的内容及其长度来处理可变长度的值,这些额外的字节是无符号整数;
请注意,可变长类型的最大长度、此类型所需额外字节数以及占用相同字节数的无符号整数之间的对应关系:
例如:mediumblob值可能最多是2的24次方 - 1字节长,并需要3个字节记录其长度,3个字节的整数类型mediumint的最大无符号值为2的24次方 - 1
二、Mysql类型与Java类型对应关系
三、Mysql数据类型选择的一些建议
- 选小不选大:一般情况下,选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘、内存和CPU缓存更小。
- 简单就好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。
- 尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值比较更加复杂。
- 浮点类型的建议统一选择decimal
- 记录时间的建议使用int或bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒进行存储,方便走索引