MySql支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
- 数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。
- 日期/时间类型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。
- 字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串类型又分为文本字符串和二进制字符串。
一. 整数类型
说明:TINYINT需要1个字节(8bits)来存储,那么它的无符号数的最大值为2的八次方减1. 有符号的最大值是2的7次方减1.
id int(4) 代表的是在id字段中的数据一般只显示4位数字的宽度。
note:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明了Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。比如:假如向id字段插入一个数值19999,当使用select查询该列的时候,Mysql显示的将时完整的带有5位数字的19999,而不是4位数字的值。
note:其它整型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。比如:
说明:系统将添加不同的默认显示宽度。这些显示宽度能够保证显示每一种数据类型可以取到取值范围内的所有值。例如TINYINT有符号和无符号数的取值范围分别为-128-127,由于负号占了1个数字,因此TINYINT默认的显示宽度为4.同理,其它整数类型的默认显示宽度与其它符号数的最小值的宽度相同。
note:显示宽度只用于显示,并不能限制取值范围和占用空间。如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
二. 浮点数类型和定点数类型
MySql中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度类浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型可以用(M,N)来表示,其中M称为精度,表示总共的位数;N称为标度,是表示小数的位数。
note:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
说明:可以看到FLOAT和DOUBLE在进行四舍五入时候没有给出警告,但是DECIMAL却给出了数据被截断的警告。
浮点数相对于定点数的有点事在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题。
float,double,decimal的区别:
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
1、CREATE TABLE test(f FLOAT(5,2) DEFAULT NULL,d DOUBLE(5,2) DEFAULT NULL,de DECIMAL(5,2) DEFAULT NULL);
2、DESC test;
3、INSERT INTO test(f,d,de) VALUES(1.23,1.23,1.23);
数据插入都正确
4、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.23);
数据插入都正确,但是f和d由于标度的限制,舍去了最后一位。
5、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);
数据也插入成功,但是有一个警告提示:
1 queries executed, 1 success, 0 errors, 1 warnings
Note Code : 1265
Data truncated for column 'de' at row 1
6、将id1,id2,id3的精度和标度都去掉
ALTER TABLE test MODIFY f FLOAT;
ALTER TABLE test MODIFY d DOUBLE;
ALTER TABLE test MODIFY de DECIMAL;
DELETE FROM test;
DESC test;
7、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);
1 queries executed, 1 success, 0 errors, 1 warnings
Note Code : 1265
Data truncated for column 'de' at row 1
f和d的数据正确插入,而de被截断。
浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如果不设置精度和标度,刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会警告!
同时,对数据求SUM()时会出现不同的结果,float和double求SUM都会出现很多小数点,而decimal求SUM得到的是精准数值:
8、INSERT INTO test(f,d,de) VALUES(1.234,0.01,1.23);
数据都插入成功
9、SELECT SUM(f),SUM(d),SUM(de) FROM test;
理论上SUM(f)=3.698,SUM(d)=2.474,SUM(de)=3.46,但f,d都出现后面很长的一串浮点小数点。
三. 日期与时间类型
1. YEAR
存储年。有两种方式,输入2位的或者4位的。并且,既可以输入整型,也可以输入字符串。
(1)输入2位的
(2)插入4位的
2. TIME
TIME类型用于只需要时间信息的值。
3. 查看系统当前日期
NOW()
四. 文本字符串类型
VARCHAR和TEXT、BLOB都是变长类型。对于其存储需求取决于列值得实际长度(在上面表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是姐夫穿的长度L,加上1个字节以记录字符串的长度。对于字符“abcd”,L为4,而存储要求是5个字节。
1. CHAR和VARCHAR类型
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格以达到指定的长度。M表示列长度。比如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4.当检索到CHAR值时,尾部的空格将被删除掉。
VARCHAR(M)是长度可变的字符串,M表示最大列长度。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1.比如,VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格依然保留。
当查询时CHAR(4)和VARCHA(4)的值并不一定相同,比如:
会发现:ch在保存“ab "时,将末尾的两个空格删除了,而vch没有删除。
2. TEXT类型
3. ENUM类型
可以看到,这里的索引值和前面所述的相同。
在比如:
系统报错,因为字符串值test不再ENUM列表中。并且,发现插入列表中的值”good“或者插入其对应的序号'2'的结果时一样的。
4. SET类型
5. 二进制字符串类型
具体用的时候再研究。
参考文献
《Mysql5.7从入门到精通》