红不,火不,愿你我都拥有红火生活
Mysql数据类型
提供最合胃口的养料
前言
主要包括以下五大类
整数类型: bit 、 bool 、 tinyint 、 smallint 、 mediumint 、 int 、 bigint
浮点数类型: float 、 double 、 decimal
字符串类型: char 、 varchar 、 tinyblob 、 blob 、 mediumblob 、 longblob 、 tinytext 、 text 、 mediumtext 、 longtext
日期类型: Date 、 DateTime 、 TimeStamp 、 Time 、 Year
其他数据类型:暂不介绍,用的比较少。
一、整数类型
上面的(n)我们在可选的范围可以规定他的大小,默认的都是有符号类型,无符号需要加上unsigned;
单纯的想是不是头发又少了一根,那怎么能行,看小王的表现:
有符号类型:
mysql> create table demo1(id int);
Query OK, 0 rows affected
mysql> insert into demo1 values (-pow(2,10)),(pow(2,10));
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from demo1;
+-------+
| id |
+-------+
| -1024 |
| 1024 |
+-------+
2 rows in set
mysql> insert into demo1 values (pow(2,31));
1264 - Out of range value for column 'id' at row 1
mysql>
我们这里的id是有符号类型的,最后一条演示的异常显然是超出范围了。但是咱们能给负数一些生存的空间不是。
无符号类型:
mysql> create table demo2( id int unsigned );
Query OK, 0 rows affected
mysql> insert into demo2 values(-1);
1264 - Out of range value for column 'id' at row 1
mysql> insert into demo2 values(pow(2,32));
1264 - Out of range value for column 'id' at row 1
mysql> insert into demo2 values(pow(2,32)-1);
Query OK, 1 row affected
mysql> select * from demo2;
+------------+
| id |
+------------+
| 4294967295 |
+------------+
1 row in set
mysql>
无符号的是从0开始的,所以我们是不能直接存负数的,其他自己悟。
类型(n)说明
无论n等于多少,int类型的永远占4个字节;
N表示的是显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了unsigned zerofill才有效;
二、浮点类型
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型。
浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度。
float和double在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
是不是有点懵呀
mysql> create table demo3(a float(5,2),b double(5,2),c decimal(5,2));
Query OK, 0 rows affected
mysql> insert into demo3 values (1,1,1),(2.1,2.1,2.1),(3.123,3.123,3.123), (4.125,4.125,4.125),(5.115,5.115,5.115),(6.126,6.126,6.126),(7.116,7.116,7.116), (8.1151,8.1151,8.1151),(9.1251,9.1251,9.1251),(10.11501,10.11501,10.11501), (11.12501,11.12501,11.12501);
Query OK, 11 rows affected
Records: 11 Duplicates: 0 Warnings: 9
mysql> select * from demo3;
+-------+-------+-------+
| a | b | c |
+-------+-------+-------+
| 1 | 1 | 1 |
| 2.1 | 2.1 | 2.1 |
| 3.12 | 3.12 | 3.12 |
| 4.12 | 4.12 | 4.13 |
| 5.12 | 5.12 | 5.12 |
| 6.13 | 6.13 | 6.13 |
| 7.12 | 7.12 | 7.12 |
| 8.12 | 8.12 | 8.12 |
| 9.13 | 9.13 | 9.13 |
| 10.12 | 10.12 | 10.12 |
| 11.13 | 11.13 | 11.13 |
+-------+-------+-------+
11 rows in set
看出点啥没
decimal采用的是四舍五入原则
float和double采用的是四舍六入五成双原则
关于财务系统,设计数据库的时候一定要注意字段类型的选择,以及根据实际情况精度的设置,这个是一个非常严肃的问题。
这里的decimal数据库字段类型可以对应一个适用于商业应用的java类型–BigDecimal类型;
毕竟float和double都是浮点数,但是我们的计算机是二进制的,浮点数会失去一定的精度。
有人可能会问,为啥会失去精度?
十进制数的二进制表示形式可能不准确;
使用的数字之间类型不匹配(float和double混合使用)
举个例子:
public class Test {
public static void main(String[] args) {
System.out.println("1.0-0.42="+(1.0-0.42));
System.out.println("(0.1+0.42) = " + ((double)0.1+(float)0.42));
}
}
会如你所愿吗(现实和理想的差距是有的,光想不现实)
买了10块钱的基金,本来能赚1毛钱的,结果你给我算没了,一天的饭钱没了,你愿意吗?
上面还有一个新奇的规则四舍六入五成双
就是5以下舍弃5以上进位,如果需要处理数字为5的时候,需要看5后面是否还有不为0的任何数
字,如果有,则直接进位,如果没有,需要看5前面的数字,若是奇数则进位,若是偶数则将5舍 掉
这里是有坑的,别问我为啥知道(/(ㄒoㄒ)/~~)
三、日期类型
如果你想要表示年月日,建议DATE;
如果你想要表示年月日时分秒,建议DATIME;
如果比经常插入或更新日期为当前的日期,建议TIMESTAMP;
当然在开发中,会有时间戳转换日期,注意一下;
(日期先这样,后面可能会继续补充)
字符串类型
char类型占用固定长度,可以存放一些固定长度的数据,比如说,你的富婆通讯录、身份证号、女朋友的生日等等
Mysql和Java类型的对应关系
数据类型选择
- 选适当大小的类型(越小的数据类型占用磁盘、内存和CPU缓存更小,速度也就快一些);
- 尽量避免NULL出现(在开发使用的时候会更加方便,尽量不要给自己制造麻烦)
总结
什么事,适度就好,做事不要太极端