Mysql学习笔记(5)--mysql的数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fhujinwu/article/details/82936208

1、float、dounle和decimal三者之间的不同

对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括 float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度。例如,定义为float(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在 float(7,4)列内插入 999.00009,近似结果是 999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而decimal在不指定精度时,默认的整数位为10,默认的小数位为0。

下面通过例子来展示三者之间的不同:

(1)创建测试表。分别将id1、id2、id3字段设置为float(5,2),double(5,2)、decimal(5,2);

 

(2)往id1、id2,id3这三个字段中插入数据1.23;会发现数据可以正常插入;

 

(3)往id1,id2,id3这三个字段插入数据1.234,1.234,1.23;我们会发现虽然可以将数据插进去,但是id1,id2会被舍去最后一位;

 

(4)同时向id1,d2,id3插入数据1.234;id3数据被截断,且系统会出现warning

 

(5)将三个字段的精度和标度曲表,在此插入1.23:

 

(6)总结:上面这个例子验证了上面提到的浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错;

2、日期时间类型

 

(1)如果要用来表示年月日,通常用DATE 来表示;

如果要用来表示年月日时分秒,通常用DATETIME表示;

如果只是表示时分秒,通常用TIME来表示;

如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP来表示。TIMESTAMP值返回后显示未"YYYY-MM-DD HH:MM:SS"格式的字符串,显示宽度固定位19个字符。如果需要获得数字值的话,应该在TIMESTAMP列添加“0”;

如果只是表示年份的话,我们可以使用YEAR,它比DARE占用更少的空间。

(2)例子:

创建一个表t,字段分别为date,time,datetime三种日期类别;然后用now()插入当前日期;

3、字符串类型

(1)char 和varchar类型

CHAR和VARCHAR很类似,都用来保存MySQL中较短的字符串。二者的主要区别在于存储方式的不同:CHAR列的长度固定为创建表时声明的长度,长度可以为从0~255的任何值;而VARCHAR列中的值为可变长字符串,长度可以指定为0~255(MySQL 5.0.3版本以前)或者 65535(MySQL 5.0.3版本以后)之间的值。在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格。

例子:①创建测试表vc,并定义两个字段“v VARCHAR(4)”和“c CHAR(4)”;

②向v和c列中同时插入字符串“ab”

③显示查询结果

 

讨论:但是实际上,我敲出来的char的长度却不是创建表时的长度。

(2)BINARY和VARBINARY类型

BINARY和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不包含非二进制字符串。在下面的例子中,对表t中的binary字段c插入一个字符,研究一下这个字符到底是怎么样存储的。

①创建测试表t3,字段为c BINARY(3):

 

(3) ENUM类型

ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节存储;对于255~65535个成员,需要2个字节存储。最多允许有65535个成员。

创建测试表t4,定义gender字段为枚举类型,成员为“M"和”F“,并且插入4条不同的记录

 

总结:ENUM类型是忽略大小写的,在存储“M”、“f”时将它们都转成了大写,还可以看出对于插入不在 ENUM 指定范围内的值时,并没有返回警告,而是插入了enum('M','F')的第一个值“M”,这点用户在使用时要特别注意。

另外,ENUM类型只允许从值集合中选取单个值,而不能一次取多个值。

4、SET类型

SET和ENUM类型非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员的不同,存储上也有所不同。

1~8成员的集合,占1个字节。

9~16成员的集合,占2个字节。

17~24成员的集合,占3个字节。

25~32成员的集合,占4个字节。

33~64成员的集合,占8个字节。

SET 和 ENUM 除了存储之外,最主要的区别在于 SET 类型一次可以选取多个成员,而ENUM则只能选一个。

例如:在表t5中插入多组不同的成员

 

总结:

SET类型可以从允许值集合中选择任意1个或多个元素进行组合,所以对于输入的值只要是在允许值的组合范围内,都可以正确地注入到SET类型的列中。对于超出允许值范围的值例如('a,d,f ')将不允许注入到上面例子中设置的SET类型列中,而对于('a,d,a')这样包含重复成员的集合将只取一次,写入后的结果为“a,d”,这一点请注意

猜你喜欢

转载自blog.csdn.net/Fhujinwu/article/details/82936208
今日推荐