mysql5.7官网直译数据类型--数字类型详解

11.2 Numeric Types 数字类型
11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT 整数类型(精确值)
11.2.2 Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC 定点类型
11.2.3 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE 浮点类型
11.2.4 Bit-Value Type - BIT 位值类型
11.2.5 Numeric Type Attributes 数字类型属性
11.2.6 Out-of-Range and Overflow Handling 溢出处理
MySQL支持所有的标准SQL数字数据类型。这些类型包括精确数字数据类型(INTEGER, SMALLINT, DECIMAL, and NUMERIC), 也有大概数字数据类型 (FLOAT, REAL, 和双精度). 关键字INT是INTEGER的同义词, 关键词 DEC 和 FIXED是DECIMAL的同义.
MySQL按双精度同义来对待DOUBLE(一个非标准的扩展). MySQL也同样对待REAL当做双精度(一个非标准扩展), 只要REAL_AS_FLOATSQL模型可用.
BIT数据类型存储位值并且在MyISAM,MEMORY,InnoDB,和NDB表中都得到支持。
对于MySQL处理溢出列值的相关信息和对表达式的评估,看部分11.2.6"Out-of-Range and Overflow Handling"
对于数字类型存储要求的信息,请看部分11.8“Data Type Storage Requirements”.
用于计算数值操作数的结果的数据类型取决于操作数的类型及其执行的操作数。更多信息请看12.6.1, “Arithmetic Operators”.算子
-----------------------------------------
11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
MySQL支持标准SQL的整数类型INTEGER(or INT)和SMALLINT。作为一个队标准的扩展, MySQL 还支持的类型是 TINYINT, MEDIUMINT, 和 BIGINT. 下面的表格展示了存储要求和每种类型的值范围.
-----------------------------------------
11.2.2 Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC 定点类型(精确值)
DECIMAL 和 NUMERIC 类型存储精确数字数据置. 当需要保存高精度值时可以使用这些数据类型, 例如货币相关数据. 在MySQL中, NUMERIC是作为DECIMAL的一种实现, 所以关于DECIMAL的如下标记同样适用于NUMERIC.
MySQL存储DECIMAL值以二进制格式。看12.21的"Precision Math"
在一个DECIMAL列的声明中,精确度和范围通常可以设定;例如:
salary DECIMAL(5,2)
在这个例子中,5是精确度,2是规模。精确度表示有效数字的个数在值中存储的, 而规模表示小数点后的数字个数。
标准SQL要求DECIMAL(5,2)能够存储任何五位数和2位小数点的值, 所以可以存储的值范围在salary列是 -999.99到999.99.
在标准SQL中,语法DECIMAL(M)于DECIMAL(M,0)等价。简单来说DECIMAL的语义和DECIMAL(M,0)一样。, 其中允许执行决定M的值。MySQL支持这些对DECIMAL的变体. M的默认值是10.
如果scale 是 0, DECIMAL值包含不包含小数点和小数部分.
DECIMAL最大的数字是65位,但是实际范围会根据给出的列中对精确度和规模的限制来决定。如果给出的值中在小数点后跟着太多位数,则会转变为指定位数 (精确度是操作系统来设定的,但影响就是允许截取的数字.)
-------------------------------------------
11.2.3 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE 浮点数类型(大概值)。
FLOAT 和 DOUBLE 类型表示大概的数字类型值。对于单精度的值mysql使用4字节来存储,而双精度采用8字节来存储。
对于FLOAT,SQL标准允许对括号中关键字浮动之后的位精度优化(但不是指数的范围),MYSQL也支持这样的特定优化,但是精度值只是被用来确定存储大小。精度结果0-24在一个4字节的单精度FLOAT列中。而值在24-53则是一个8字节的双精度DOUBLE列。
MYSQL允许一个标准的语法:FLOAT(M,D)或者REAL(M,D)或者DOUBLE PRECISION(M,D)。其中,(M,D) 意味着能够存储的值最多M个数字,D数字是点号后的可能数位。例如,列定义为FLOAT(7,4),那么-999.9999可以被展示。MYSQL允许四舍五入,如果你插入999.00009 到一个FLOAT(7,4)的列,则可能的值为:999.0001.
因为浮点值是大概值并且不存储精确值,如果把它当做精确值来处理,会有一些问题。他们也受平台或者相关依赖的影响。更多信息,请看B.5.4.8,"浮点数值的问题"。
为了最大可移植性,编码要求存储了大约值使用FLOAT或者DOUBLE精度,没有特别准确的值,或者数字位.
------------------------------------------
11.2.4 Bit-Value Type - BIT 位值类型
BIT数据类型用于存储bit值。BIT(M)能够粗存储M-bit值。M的范围是1到64。
为了设置bit值,b'value'标记法能够被使用。value是用0和1写的二进制值。例如,b'111'和b'10000000'表示的值分别是7和128.看9.1.5位值的直接量。
如果你设计一个值为一个BIT(M)位的列存储少于M位长度的值,那么左侧位值会用0来填充。例如,存储b'101'到一个BIT(6)的列中,那么其实存储为b'000101'.
NDB集群中所有BIT列使用在一个NDB表中的最大结合大小不能超过4096bits.
-------------------------------------------
11.2.5 Numeric Type Attributes 数字类型的属性
MySQL支持扩展,可以选择在类型的基本范围后面指定整数数据类型的显示宽度。例如,INT(4)设定一个INT的展示宽度为4个数字。 这种优化展示可由应用程序使用以显示具有小于为列指定的宽度的整数值,铜鼓将它们与空格隔开。(也就是说,这个宽度表示被返回的元数据的结果集,是否使用取决于应用程序)
展示宽度并不会限制存储在列中的值的范围。也不阻止比列显示宽度更大的值被正确显示。例如,一个列被设置为SMALLINT(3)也有SMALLINT的存储范围-32768 到 32767,并且多出三位的值将使用三位以上的全部显示。
当和优化ZEROFILL属性一起来使用时,空间的默认填充是使用0来填充的。例如,如果一个列声明为INT(4) ZEROFILL,值5将会被存储为0005.
注意:
ZEROFILL属性会被忽略,当一个列被使用到表达式或者UNION查询的时候。
如果你存储的值比要展示的整数列更大,且设置了列属性ZEROFILL,你可能会遇到一些问题,当mysql为一些复杂的连接产生的临时表。在这种情况下,mysql假设了数据值可以在被展示的列中填充。
所有的整数类型能够有一个优化(非标准)属性UNSIGNED.Unsigned类型能够用于存储非负数在一个列或者当你需要一个更大的范围对列。例如,如果INT列被设置为UNSIGNED,列的范围的大小是相同的,但是开始和结束点不同,由原来的-2147483648 到 2147483647变为0 到4294967295


浮点类型和定点类型也能够使用UNSIGNED,就像整数类型一样,这一属性不允许负数值存储在列。不像整数类型。列的上限值依然相同。
如果你设置了ZEROFILL对一个数字列,MYSQL自动添加UNSIGNED属性到列。INTEGER 或者浮点数据类型能够有额外属性AUTO_INCREMENT.当你插入一个NULL值到一个被索引的AUTO_INCREMENT列,列设置了下一个值。这个值就是value+1,其中值是当前表中列的最大值。AUTO_INCREMENT序列以1开始。
存储0到一个AUTO_INCREMENT列和NULL存储在列中有相同影响,除非你开启NO_AUTO_VALUE_ON_ZERO SQL模式。
插入NULL值到自动生成的AUTO_INCREMENT值要求列被声明为NOT NULL。如果列被声明为NULL,插入NULL存储一个NULL。当你插入任何一个其他值到AUTO_INCREMENT列,列被设置为其值,并且序列被重置,以至于下一个自动增长值在插入值之后。
在MYSQL5.7,负数值不允许出现在AUTO_INCREMENT列中。
------------------------------------------
11.2.6 Out-of-Range and Overflow Handling 超出范围和溢出处理
当mysql存储值到数字列,超过了列数据类型允许的范围,结果依赖于SQL模式的影响时:
>如果是严格的SQL模式,MySQL拒绝越界值并给出一个错误,然后插入失败,于SQL标准一致。
>如果不是严格的SQL模式,MySQL会剪切值到合适的范围并将合适值存储。
当一个越界值被设置到一个整数列,mysql存储值通过正确的数据类型范围点。
当一个浮点或者定点值列被设置的值超过了声明中给出的范围或者是默认的精确度,Mysql存储值也根据范围找到正确的点并存储。
假设表t1的定义如下:
CREATE TABLE t1 (i1 TINYINT, i2 TINYINT UNSIGNED);
因为严格的SQL模型,越界错误发生:
mysql> SET sql_mode = 'TRADITIONAL';
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
ERROR 1264 (22003): Out of range value for column 'i1' at row 1
mysql> SELECT * FROM t1;
Empty set (0.00 sec)
关闭严格SQL模型,会存储但是有剪切,可以通过警告看出。
mysql> SET sql_mode = '';
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'i1' at row 1 |
| Warning | 1264 | Out of range value for column 'i2' at row 1 |
+---------+------+---------------------------------------------+
mysql> SELECT * FROM t1;
+------+------+
| i1   | i2   |
+------+------+
|  127 |  255 |
+------+------+
当严格SQL模式不可用时,列符号转变会发生,因为剪切而发出的警告对ALTER TABLE,LOAD DATA INFILE,UPDATE和多列插入语句。在严格模型,这些语句会失败,一些或者全部值不会被插入或改变,依赖于表是否是支持事物的和其他因素。更详细的情形,请看5.1.8的服务SQL模式。




数字表达式求值过程中的溢出导致错误。例如,最大的BIGINT值是9223372036854775807,所以下面的表达式会引发错误:
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'
为了能够在这种情况下成功操作,转变值为无符号:
mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+
是否溢出完全依赖于操作数的范围,所以另外的方法来处理表达式是使用exact-value数字,因为DECIMAL值比INTEGER要大很多:
mysql> SELECT 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+
整数值减法,只要其中一个是无符号类型则结果也默认是无符号类型。如果结果是负数,则会是一个错误结果:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
如果NO_UNSIGNED_SUBTRACTIONsql模型可用的的话,结果是负数:
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
如果操作的结果是更新一个无符号整数列,结果被截取到最大的列类型值,或者剪切为0,如果NO_UNSIGNED_SUBTRACTION模式开启的话。
如果开启严格SQL模型,会产生错误并且列的属性不会改变。
到此数据类型就结束了,接下来我们看日期和时间类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值