数值数据类型语法
对于整数数据类型,M指示最大显示宽度。最大显示宽度为255。显示宽度与类型可以存储的值的范围无关,如“数字类型属性”中所述。
对于浮点和定点数据类型,M是可以存储的总位数。
从MySQL 8.0.17开始,对于整数数据类型,不建议使用display width属性,并且在将来的MySQL版本中将删除对它的支持。
如果ZEROFILL为数字列指定,MySQL会自动将该UNSIGNED属性添加到该列。
从MySQL 8.0.17开始,ZEROFILL不推荐使用数字数据类型的属性,并且在将来的MySQL版本中将不再支持该属性。考虑使用替代方法来产生此属性的效果。例如,应用程序可以使用该LPAD()功能对数字进行零填充以达到所需的宽度,或者可以将格式化的数字存储在CHAR列中。
允许该UNSIGNED属性的数值数据类型也允许SIGNED。但是,这些数据类型默认情况下是签名的,因此该SIGNED属性无效。
从MySQL 8.0.17开始,该UNSIGNED属性不适用于类型为FLOAT,DOUBLE和和DECIMAL(以及任何同义词)的列,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK对此类列使用简单约束。
SERIAL是的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE。
SERIAL DEFAULT VALUE在整数列的定义中,是的别名NOT NULL AUTO_INCREMENT UNIQUE。
警告当您在类型为1的整数值之间使用减法时
UNSIGNED,除非NO_UNSIGNED_SUBTRACTION启用了SQL模式,否则结果是无符号的。请参见“信息函数”。
BIT[(M)]位值类型。
M表示每个值的位数,从1到64。如果M省略,默认值为1 。TINYINT[(M)][UNSIGNED][ZEROFILL]一个非常小的整数。签署的范围是
-128到127。无符号的范围是0到255。BOOL,BOOLEAN这些类型是的同义词
TINYINT(1)。零值被认为是错误的。非零值被视为true:mysql>
SELECT IF(0, 'true', 'false'); +------------------------ + | IF(0, 'true', 'false') | +------------------------ + | false | +------------------------ + mysql>SELECT IF(1, 'true', 'false'); +------------------------ + | IF(1, 'true', 'false') | +------------------------ + | true | +------------------------ + mysql>SELECT IF(2, 'true', 'false'); +------------------------ + | IF(2, 'true', 'false') | +------------------------ + | true | +------------------------ +然而,这些值
TRUE和FALSE仅是别名1和0分别,如下所示:mysql>
SELECT IF(0 = FALSE, 'true', 'false'); +-------------------------------- + | IF(0 = FALSE, 'true', 'false') | +-------------------------------- + | true | +-------------------------------- + mysql>SELECT IF(1 = TRUE, 'true', 'false'); +------------------------------- + | IF(1 = TRUE, 'true', 'false') | +------------------------------- + | true | +------------------------------- + mysql>SELECT IF(2 = TRUE, 'true', 'false'); +------------------------------- + | IF(2 = TRUE, 'true', 'false') | +------------------------------- + | false | +------------------------------- + mysql>SELECT IF(2 = FALSE, 'true', 'false'); +-------------------------------- + | IF(2 = FALSE, 'true', 'false') | +-------------------------------- + | false | +-------------------------------- +最后两个语句显示显示的结果,因为
2既不等于1也不等于0。SMALLINT[(M)][UNSIGNED][ZEROFILL]一个小整数。签署的范围是
-32768到32767。无符号的范围是0到65535。MEDIUMINT[(M)][UNSIGNED][ZEROFILL]中型整数。签署的范围是
-8388608到8388607。无符号的范围是0到16777215。INT[(M)][UNSIGNED][ZEROFILL]普通大小的整数。签署的范围是
-2147483648到2147483647。无符号的范围是0到4294967295。INTEGER[(M)][UNSIGNED][ZEROFILL]此类型是的同义词
INT。BIGINT[(M)][UNSIGNED][ZEROFILL]一个大整数。签署的范围是
-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。SERIAL是的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE。关于
BIGINT列,您应该注意以下几点:所有算术都是使用有符号
BIGINT或DOUBLE值完成的,因此9223372036854775807除位函数外,不要使用大于(63位)的无符号大整数!如果这样做,由于将BIGINT值转换为时的舍入错误,结果中的最后几位可能会出错DOUBLE。MySQL
BIGINT在以下情况下可以处理:- 使用整数将大的无符号值存储在
BIGINT列中时。 - 在或中,其中指的是列。
MIN(col_name)MAX(col_name)col_nameBIGINT - 当使用操作符(
+,-,*,等等),其中两个操作数都是整数。
- 使用整数将大的无符号值存储在
- 您始终可以
BIGINT通过使用字符串将精确的整数值存储在列中。在这种情况下,MySQL执行的字符串到数字的转换不涉及中间的双精度表示形式。 -,+和*运营商使用BIGINT,当两个操作数是整数值运算。这意味着,如果您将两个大整数相乘(或返回整数的函数的结果),则当结果大于时,可能会得到意外的结果9223372036854775807。
DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]压缩的“精确”定点数字。
M是位数的总数(精度),D是小数点后的位数(小数位数)。小数点和(对于负数)-符号不计入M。如果D为0,则值没有小数点或小数部分。的最大位数(M)为DECIMAL65。支持的小数位数(D)的最大值为30。如果D省略,则默认值为0。如果M省略,则默认值为10。UNSIGNED,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED不推荐使用类型DECIMAL(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK对此类列使用简单约束。所有
+,-,*,/带DECIMAL列的基本计算()的精度为65位。DEC[(M[,D])][UNSIGNED][ZEROFILL],,NUMERIC[(M[,D])][UNSIGNED][ZEROFILL]FIXED[(M[,D])][UNSIGNED][ZEROFILL]这些类型是的同义词
DECIMAL。该FIXED同义词可用于与其他数据库系统兼容。FLOAT[(M,D)][UNSIGNED][ZEROFILL]一个小的(单精度)浮点数。允许值是
-3.402823466E +38对-1.175494351E-38,0以及1.175494351E-38对3.402823466E +38。这些是基于IEEE标准的理论极限。实际范围可能会略小,具体取决于您的硬件或操作系统。M是位数的总和,D是小数点后的位数。如果M和D省略,则将值存储到硬件允许的极限。单精度浮点数的精度约为小数点后7位。FLOAT(M,D)是非标准的MySQL扩展。从MySQL 8.0.17开始,不推荐使用此语法,并且在将来的MySQL版本中将不再支持该语法。UNSIGNED,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED不推荐使用类型FLOAT(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK对此类列使用简单约束。使用
FLOATMySQL可能会给您带来一些意想不到的问题,因为MySQL中的所有计算都是以双精度完成的。请参见第B.4.4.7节“解决没有匹配行的问题”。FLOAT(p)[UNSIGNED][ZEROFILL]浮点数。
p代表以位为单位的精度,但是MySQL仅使用此值来确定是使用FLOAT还是DOUBLE用于结果数据类型。如果p从0到24,则数据类型将变为FLOATnoM或Dvalues。如果p是25到53,则数据类型将变为DOUBLEnoM或Dvalues。结果列的范围与本节前面介绍的单精度FLOAT或双精度DOUBLE数据类型相同。UNSIGNED,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED不推荐使用类型FLOAT(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK对此类列使用简单约束。FLOAT(p)提供了语法以实现ODBC兼容性。DOUBLE[(M,D)][UNSIGNED][ZEROFILL]普通大小(双精度)浮点数。允许值是
-1.7976931348623157E +308对-2.2250738585072014E-308,0以及2.2250738585072014E-308对1.7976931348623157E +308。这些是基于IEEE标准的理论极限。实际范围可能会略小,具体取决于您的硬件或操作系统。M是位数的总和,D是小数点后的位数。如果M和D省略,则将值存储到硬件允许的极限。双精度浮点数精确到大约15个小数位。DOUBLE(M,D)是非标准的MySQL扩展。从MySQL 8.0.17开始,不推荐使用此语法,并且在将来的MySQL版本中将不再支持该语法。UNSIGNED,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED不推荐使用类型DOUBLE(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK对此类列使用简单约束。DOUBLE PRECISION[(M,D)][UNSIGNED][ZEROFILL],REAL[(M,D)][UNSIGNED][ZEROFILL]这些类型是的同义词
DOUBLE。例外:如果REAL_AS_FLOAT启用了 SQL模式,REAL则是FLOAT而不是的同义词DOUBLE。
