本文整理自网络,侵删。
目录
- 整数类型
- 浮点数类型和定点数类型
- 那么在mysql中,浮点数类型和定点数类型的取值范围有多大呢?
- 日期与时间类型
- YEAR
- TIME
- 栗子
整数类型
数值型数据类型主要用来存储数字,mysql
提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。
mysql
主要提供的整数类型有TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
。整数类型的属性字段可以添加AUTO_INCREMENT
自增约束条件。
看下下面两个表;
- 表一:
mysql
中的整数型数据类型 - 表二、
mysql
不同整数类型的取值范围
举个例子:
year int(4);
该声明指明,在year
字段中的数据一般只显示4
位数字的宽度;
注意点:显示宽度和数据类型取值范围是无关的。显示宽度只是指明mysql
最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。
例如:向year
字段插入一个数值12345
,当使用select
查询该列值的时候,mysql
显示的将是完整的带有5位数字的12345
,而不是4位数字的值。
其他整数型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。整数类型是不带小数部分的数值,现实生活中很多地方都需要用到带小数的数值。下面我们就来介绍下小数类型。
注意点:显示宽度只用于显示,并不能限制取值范围和占用空间。
浮点数类型和定点数类型
mysql
中使用浮点数和定点数来表示小数。
浮点数类型有两种:
- 单精度浮点类型(FLOAT)
- 双精度浮点类型(DOUBLE)
定点数类型只有一种:
- DECIMAL
浮点数类型和定点数类型都可以用(M,N)来表示。其中呢,我们用M
称为精度,表示总共的位数;N
称为标度,表示小数的位数。
DECIMAL
类型不同于FLOAT
和DOUBLE
,DECIMAL
实际是以串存放的,可能的最大取值范围和DOUBLRE
一样,但是其有效的取值范围由M
和D
的值来决定。怎么说呢?
如果改变M
而固定D
,则其取值范围将随着M
的变大而变大。
那么在mysql中,浮点数类型和定点数类型的取值范围有多大呢?
几乎正常业务情况下是不可能用完的,因为他们的取值范围如下:
FLOAT
类型的取值范围:
- 有符号的取值范围:-3.402823466E+38 ~-1.175494351E-38
- 无符号的取值范围:0和1.175494351E-38 ~3.402823466E+38
DOUBLE
类型的取值范围:
- 有符号的取值范围:-1.7976931348623157E+308 ~-2.2250738585072014E-308
- 无符号的取值范围:0和2.2250738585072014E-308~ 1.7976931348623157E+308
注意点:无论是定点数还是浮点数类型,如果用户指定的精度超出精度范围,则会四舍五入。
可能有点绕,举个栗子吧:
创建一个数据表为yunweijia_1
,字段类型如下;
mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1)); Query OK, 0 rows affected, 2 warnings (0.04 sec) mysql>
然后我们在这个表中插入一条数据,sql
语句如下:
mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888); Query OK, 1 row affected, 1 warning (0.01 sec) mysql>
看上面的提示信息,是不是在我们执行插入语句的时候,给了一个警告信息,然后我们来看下这个警告信息是什么吧;
mysql> show warnings; +-------+------+----------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------+ | Note | 1265 | Data truncated for column 'z' at row 1 | +-------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql>
可以看到他提示说,z
字段在插入的时候被截断了,但是x
和y
截断就没有提出警告。
那么查看下结果吧:
mysql> select * from yunweijia_1;
+------+------+------+
| x | y | z |
+------+------+------+
| 6.7 | 7.8 | 8.9 |
+------+------+------+
1 row in set (0.00 sec)
mysql>
可以看到分别都进行了四舍五入,这点需要注意。
FLOAT
和DOUBLE
在不指定精度操作时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL
若不指定精度则默认为(10,0);
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;他的缺点是会引起精度问题;
注意点:在
mysql
中,定点数以字符串形式存储,在对精度要求比较高的时候,使用DECIMAL
的类型比较好,另外,两个浮点数进行减法和比较运算时,容易出现问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
日期与时间类型
mysql
中有多种表示日期的数据类型,主要有:
- DATETIME
- DATE
- TIMESTAMP
- TIME
- YEAR
比如说,当只记录年信息的时候,可以只使用YEAR
类型,而没有必要使用DATE
。
每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。
YEAR
year
类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定year
值,如下:
- 1、以4位字符串或者4位数字格式表示的
year
,范围为1901
~2155
。输入格式为yyyy
或者'yyyy',例如:输入‘2022’或者2022,插入到数据库的值均为2022。 - 2、以2位字符串格式表示的
year
,范围为“00”到“99”。“00”~“69”和“70”~“99”范围的值分别被转换为“2022”~“2069”和“1970”~“1999”范围的year
值。“0”与“00”的作用相同。插入超过取值范围的值将被转换成2000
。 - 3、以两位数字表示的
YEAR
,范围为1~99。1~69和70~99范围的值分别被转换为200·~2069和1970~1999范围的YEAR
值。和字符相比较而言,这里的0值,将被转换成0000,而不是2000。
注意点:
两位整数范围与两位字符串范围稍有不同。例如,插入2000年,有人可能会使用数字格式的0表示
year
,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正确的解释为2000,。非法YEAR
值将被转换为0000。
栗子:
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 最全mysql数据类型梳理汇总
相关推荐
评论
管理员已关闭评论功能...