分为三大类
数值型:
整形
小数:
定点数
浮点数(浮点型)
字符型:
较短的文本:char varchar
较长的文本:text blob(较长的二进制数据:图片)
日期型:
1.整形
特点:
①列名后的类型默认是有符号的,无符号需要追加 unsigned(安set)
②插入的数值超出 报异常 1264 - Out of range value for column
③不设置长度会有默认的长度
长度是显示结果中的最大宽度,不够宽度在左边用0填充,
但是,没有关键字 zerofill 就不会显示出0,默认宽度无效显示不出来0。
如果,有关键字 zerofill 类型默认的就会变成无符号,不支持负数 unsigned 就没有意义了。
④长度规定不了范围,范围是由类型决定的。长度决定的是显示结果的样子
#1.设置有符号、无符号 CREATE TABLE tab_int( t1 INT ZEROFILL, t2 INT ZEROFILL ); #查看表的结构 DESC tab_int; #插入数据 #添加值的时候可以省略字段名,值的顺序和列的顺序一一对应 INSERT INTO tab_int VALUES(-132); INSERT INTO tab_int VALUES(-13256,-123); INSERT INTO tab_int VALUES(123,123); #删除表 DROP TABLE IF EXISTS tab_int; SELECT * FROM tab_int
2.小数
浮点型 | 字节 |
float(M,D) | 4 |
double(M,D) | 8 |
精度高无限接近真实的值
定点型 | 字节 | 范围 |
dec(M,D) | M+2 | 最大取值和double相同,精度比double要精确 |
decimal可以简写为dec
特点:
①M和D。M小数位数+整数位数的=总位数,D是小数的位数
②M和D可以省略
decimal M默认值:10 D的默认值:0。超过了就会报错
float和double,会根据插入的数值的精度来决定精度
③定点型的精度较高,如果要求插入的精度较高(货币运算...)优先考虑
④其他的用float和double,为了节省空间float够用就用float
原则:
所选的类型越简单越好,能保存数值的类型越小越好
#创建表 CREATE TABLE tab_float( f1 FLOAT(5,2), f2 DOUBLE(5,2), f3 DECIMAL(5,2) ); #测试表 INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523); #查询 SELECT * FROM tab_float #每列下面各一个123.45 DESC tab_float; #测试表 INSERT INTO tab_float VALUES(123.456,123.456,123.456); #查询 SELECT * FROM tab_float #每列下面各一个123.46,结果四舍五入 #> Affected rows: 1出现一个警告 #测试表 INSERT INTO tab_float VALUES(1523.4,1523.4,1523.4); #报错> 1264 - Out of range value 超出数值范围 #删除表 DROP TABLE tab_float; #创建表 CREATE TABLE tab_float( f1 FLOAT, f2 DOUBLE, f3 DECIMAL ); #测试表 INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523); #> Affected rows: 1一列出错 #查询 SELECT * FROM tab_float #查看表的结构 DESC tab_float;
3.字符型(串数据:文本型、二进制)
较短的文本 | 最多字符数 | 特点 | 空间耗费 | 效率 |
char(M) | M | 固定长度的字符 | 比较耗费 | 高 |
varchar(M) | M | 可变长度的字符 | 比较节省 | 低 |
①字符数:一个a也是一个字符,一个汉字也是一个字符
②char的M可以省略,默认:1。固定长度的字符:类型后的固定长度,用不用都开那么多空间
varchar的M不能省略。可变长度的字符:按数据长度,开空间
③固定长度例如:
男,女存储用char
存储姓名用varchar
较长的文本
text
较短的二进制数
binary
varbinary
较长的二进制
blob
放入一个有值的列表,插入的数据只能为其中一个
enum用于保存枚举(一次只能选一个成员)
set用于保存集合(一次能选多个成员)
#enum枚举(男女,季节) CREATE TABLE tab_char( c1 ENUM('a','b','c') ) #插入数据 INSERT INTO tab_char VALUES('a'); INSERT INTO tab_char VALUES('b'); INSERT INTO tab_char VALUES('c'); INSERT INTO tab_char VALUES('M'); INSERT INTO tab_char VALUES('A'); #清空表中的数据 TRUNCATE TABLE tab_char # SELECT * FROM tab_char #set集合() CREATE TABLE tab_set( s1 SET('a','b','c','d') ) #插入数据 INSERT INTO tab_set VALUES('a'); INSERT INTO tab_set VALUES('a,b'); INSERT INTO tab_set VALUES('a,c,d'); #MySQL不区分大小写
4.日期型
要求:字符和日期型要加单引号,数值型不用加
单一存储 | 最小值 | 最大值 | 字节 |
date只能保存:年-月-日 | 1000-01-01 | 9999-12-31 | 4 |
time只能保存:时间 | -838:59:59 | 838:59:59 | 3 |
year只能保存:年份 | 1901 | 2155 | 1 |
既有日期又有时间 | 最小值 | 最大值 | 字节 |
datetime:年-月-日 时间 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 8 |
timestamp:年月日时间 | 19700101080001 | 2038年的某个时刻 | 4 |
timestamp时间戳
特点
①datetime:不受时区影响,如果直插入年,默认提供时间
只能反映出插入时,当时的时区
②timestamp:受时区影响
更加接近当前时区的时间
受到当地的:实际时区、MySQL版本、SQLMode(语法模式)的影响
#创建表 CREATE TABLE tab_date( t1 datetime, t2 TIMESTAMP ) #插入数据 INSERT INTO tab_date VALUES(now(),now()); #查看 SELECT * FROM tab_date #查看时区 SHOW VARIABLES LIKE 'time_zone'; #设置时区 SET time_zone='+8:00';