MySQL 数据类型
1)整数型
类型 |
占用空间 |
最小值 |
最大值 |
举栗与知识点 |
---|---|---|---|---|
INT | 4 |
signed -2147483648 (-2^31)【默认】 unsigned 0 |
2147483647 (2^31-1) 4294967295 (2^32-1) |
int的默认类型是有符号的
|
BIGINT | 8 |
signed -2^63 【默认】 unsigned 0 |
2^63 2^64-1 |
int(3) int(11)中3和11的含义: 这里的3跟11表示显示宽度,本身没有意义,只有与zerofill配合在一起,才会起作用。
原因是signed int 的默认显示宽度是11。。为什么11是默认值,是因为signed int类型的取值范围-2147483648~ 2147483647,最大值加上符号位是11位,当我设定int为unsigned,它的取值范围是0~ 4294967295,对应的默认显示宽度是10,如图所示。 INT类型的属性: UNSIGNED/SIGNED: 是否有符号 ZEROFILL: 定义显示宽度,不会更改值,当插入数据宽度大于定义的宽度,不会对插入的数据有任何影响,还会按照类型的实际进度进行保存,这时宽度格式已经没有任何意义。 Auto_INCREMENT:自增,每张表一个自增字段,该自增字段,必须有唯一索引,以避免序号重复
|
2).浮点型
类型 |
占用空间 |
有效位数
|
知识点 |
---|---|---|---|
单精度类型: FLOAT |
4 | 8 |
1、float(M,D)/DOUBLE(M,D)/DECIMAL(M,D),M表示总位数,D表示小数点后面有几位,M和D又称为精度和标度。 2、mysql在保存值的时候,会进行四舍五入,例如float(7,4),当插入,999.00009 这个时候会显示999.0001 3.FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。 |
双精度类型: DOUBLE |
8 | 16 |
|
高精度类型:DECIMAL | 变长 |
1.DECIMAL用于在数据库中存储精确的数值,FLOAT与DOUBLE在数据库中存放的是近似值 2. |
在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数,浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,需要记住以下几点:
参考:https://blog.csdn.net/qq_32823673/article/details/80410238
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。
3)字符类型
类型 |
说明 |
最大长度 |
用途
|
---|---|---|---|
char(n) | 定长字符 | 255字节 | 定长字符串 |
varchar(n) | 变长字符 | 65535字节 | 变长字符串 |
tinytext | 大对象 | 255字节 | 短文本字符串 |
text | 大对象 | 65535字节 | 长文本数据 |
知识点:
1.char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节
2.char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
3.超过char和varchar的n设置后,可能会出现报错或者是字符串的截断,跟MySQL的版本有关。
4、char的上限为255字节,varchar的上限65535字节,text的上限为65535。
5、char在存储的时候会截断尾部的空格,varchar和text不会。
6、varchar会使用1-3个字节来存储长度,text不会。
7.当varchar大于某些数值的时候,其会自动转换为text,大概规则如下:
- 大于varchar(255)变为 tinytext
- 大于varchar(500)变为 text
所以对于过大的内容使用varchar和text没有太多区别。
总结:
- char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限255。
- varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限65535,但是有存储长度实际65532最大可用。
- text,存变长大数据,速度慢,不存在空间浪费,不处理尾部空格,上限65535,会用额外空间存放数据长度,顾可以全部使用65535。
举例:
字符串类型-----ENUM & SET
ENUM类型最多运行65536个值,SET类型最多允许64个值,set类型一次可以选取多个成员,而ENUM则只能选一个,就相当于ENUM是单选,而set是复选
- mysql> create table b ( user varchar(30),sex ENUM('male','female'));
- Query OK, 0 rows affected (0.07 sec)
- mysql> insert into b values( 'david','male');
- Query OK, 1 row affected (0.01 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> insert into b values( 'john','bmale');
- ERROR 1265 (01000): Data truncated for column 'sex' at row 1
4)日期类型
类型
|
大小
(字节) |
范围
|
格式
|
用途
|
---|---|---|---|---|
DATE | 3 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'~'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901~2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 |
1970-01-01 00:00:00 UTC~2038-01-19 03:14:07 UTC |
YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
日期函数
- NOW() 返回sql执行的时间
- current_timestamp 与now()函数同义
常用的创建包含create_time与update_time表的命令:
|
|
---|---|
create table test_time (id int(10) NOT NULL AUTO_INCREMENT , name varchar(10), create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`)); |
CURRENT_TIMESTAMP 字段设置后 当insert数据时 mysql会自动设置当前系统时间 赋值给该属性字段 ON UPDATE CURRENT_TIMESTAMP 字段设置后 当update数据时 并且 成功发生更改时 mysql会自动设置当前系统时间 赋值给该属性字段
|