暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 11.1.1 数值数据类型语法

原创 由迪 2021-12-21
924

对于整数数据类型,*M*表示最大显示宽度。最大显示宽度为 255。显示宽度与类型可以存储的值范围无关,如 第 11.1.6 节,“数字类型属性”所述

对于浮点和定点数据类型, *M*是可以存储的总位数。

从 MySQL 8.0.17 开始,不推荐使用整数数据类型的显示宽度属性;您应该期望在未来版本的 MySQL 中删除对它的支持。

如果您ZEROFILL为数字列指定,MySQL 会自动将该UNSIGNED 属性添加到该列。

从 MySQL 8.0.17 开始,ZEROFILL不推荐使用该属性用于数字数据类型;您应该期望在未来版本的 MySQL 中删除对它的支持。考虑使用产生此属性效果的替代方法。例如,应用程序可以使用该 LPAD()函数将数字零填充到所需的宽度,或者它们可以将格式化的数字存储在CHAR 列中。

允许该UNSIGNED 属性的数字数据类型也允许SIGNED。但是,默认情况下这些数据类型是有符号的,因此该 SIGNED属性不起作用。

如MySQL的8.0.17中,UNSIGNED属性是不鼓励对类型的列 FLOATDOUBLEDECIMAL(和任何同义词); 您应该期望在未来版本的 MySQL 中删除对它的支持。考虑CHECK 对此类列使用简单约束。

SERIAL是 的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

SERIAL DEFAULT VALUE在整数列的定义中是 的别名NOT NULL AUTO_INCREMENT UNIQUE

警告

当您在一个类型为 的整数值之间使用减法时UNSIGNED,结果是无符号的,除非NO_UNSIGNED_SUBTRACTION启用了 SQL 模式。请参阅第 12.11 节,“转换函数和运算符”

  • BIT[(*M*)\]

    位值类型。*M表示每个值的位数,从 1 到 64。如果M*省略,则默认为 1 。

  • TINYINT[(*M*)\] [UNSIGNED] [ZEROFILL]

    一个非常小的整数。签署的范围是 -128127。无符号范围是0to 255

  • BOOL, BOOLEAN

    这些类型是 的同义词 TINYINT(1)。零值被认为是错误的。非零值被认为是真的:

    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 | +------------------------+

    然而,这些值TRUEFALSE仅是别名 10分别,如下所示:

    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]

    一个小整数。签署的范围是 -3276832767。无符号范围是0to 65535

  • MEDIUMINT[(*M*)\] [UNSIGNED] [ZEROFILL]

    一个中等大小的整数。签署的范围是 -83886088388607。无符号范围是0to 16777215

  • INT[(*M*)\] [UNSIGNED] [ZEROFILL]

    一个正常大小的整数。签署的范围是 -21474836482147483647。无符号范围是 0to 4294967295

  • INTEGER[(*M*)\] [UNSIGNED] [ZEROFILL]

    这种类型是 的同义词 INT

  • BIGINT[(*M*)\] [UNSIGNED] [ZEROFILL]

    一个大整数。签署的范围是 -92233720368547758089223372036854775807。无符号范围是0to 18446744073709551615

    SERIAL是 的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

    关于BIGINT列,您应该注意的一些事项 :

    • 所有算术都是使用有符号 BIGINTDOUBLE值完成的,因此9223372036854775807除了位函数外,您不应使用大于(63 位)的无符号大整数 !如果这样做,结果中的某些最后一位数字可能会因为将 BIGINT值转换为 DOUBLE.

      MySQL可以处理BIGINT 以下情况:

    • BIGINT通过使用字符串存储它, 您始终可以将精确的整数值存储在 列中。在这种情况下,MySQL 执行字符串到数字的转换,不涉及中间双精度表示。

    • -+* 运营商使用BIGINT ,当两个操作数是整数值运算。这意味着如果您将两个大整数(或返回整数的函数的结果)相乘,当结果大于 时,您可能会得到意想不到的结果 9223372036854775807

  • DECIMAL[(*M*[,*D*\])] [UNSIGNED] [ZEROFILL]

    一个压缩的“精确”定点数。 *M是总位数(精度),D*是小数点后的位数(小数位数)。小数点和(对于负数) -符号不计入 M. 如果 *D为 0,则值没有小数点或小数部分。的最大位数 ( M) 为 DECIMAL65。支持的最大小数位数 ( D) 为 30。如果D省略,则默认为 0。如果M*省略,默认值为 10。(文字文本的长度也有限制DECIMAL;请参阅第 12.25.3 节,“表达式处理”。)

    UNSIGNED,如果指定,则不允许负值。从 MySQL 8.0.17 开始,UNSIGNED不推荐使用 type 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-380以及1.175494351E-383.402823466E+38。这些是基于 IEEE 标准的理论限制。实际范围可能略小,具体取决于您的硬件或操作系统。

    M是总位数,D是小数点后的位数。如果省略M 和*D*,则将值存储到硬件允许的限制范围内。单精度浮点数大约精确到小数点后 7 位。

    FLOAT(*M*,*D*) 是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,此语法已弃用,您应该期望在未来版本的 MySQL 中删除对它的支持。

    UNSIGNED,如果指定,则不允许负值。从 MySQL 8.0.17 开始,UNSIGNED不推荐使用 type 列FLOAT(和任何同义词)的 属性,您应该期望在未来版本的 MySQL 中删除对它的支持。考虑CHECK对此类列使用简单约束。

    使用FLOAT可能会给您带来一些意想不到的问题,因为 MySQL 中的所有计算都是以双精度完成的。请参见 第 B.3.4.7 节“解决没有匹配行的问题”

  • FLOAT(*p*) [UNSIGNED\] [ZEROFILL]

    一个浮点数。p 表示以位为单位的精度,但 MySQL 仅使用此值来确定是否使用 FLOATDOUBLE用于结果数据类型。如果*p是从 0 到 24,则数据类型变为FLOAT没有M*或 *D*值。如果 *p*是从 25 到 53,则数据类型变为DOUBLEMD 值。结果列的范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。

    UNSIGNED,如果指定,则不允许负值。从 MySQL 8.0.17 开始,UNSIGNED不推荐使用 type 列FLOAT(和任何同义词)的 属性,您应该期望在未来版本的 MySQL 中删除对它的支持。考虑CHECK对此类列使用简单约束。

    FLOAT(*p*) 为 ODBC 兼容性提供了语法。

  • DOUBLE[(*M*,*D*)\] [UNSIGNED] [ZEROFILL]

    正常大小(双精度)浮点数。允许值是 -1.7976931348623157E+308-2.2250738585072014E-3080以及 2.2250738585072014E-3081.7976931348623157E+308。这些是基于 IEEE 标准的理论限制。实际范围可能略小,具体取决于您的硬件或操作系统。

    M是总位数,D是小数点后的位数。如果省略M 和*D*,则将值存储到硬件允许的限制范围内。双精度浮点数精确到大约 15 位小数。

    DOUBLE(*M*,*D*) 是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,不推荐使用此语法,您应该期望在未来版本的 MySQL 中删除对它的支持。

    UNSIGNED,如果指定,则不允许负值。从 MySQL 8.0.17 开始,UNSIGNED不推荐使用 type 列DOUBLE(和任何同义词)的 属性,您应该期望在未来版本的 MySQL 中删除对它的支持。考虑CHECK对此类列使用简单约束。

  • DOUBLE PRECISION[(*M*,*D*)\] [UNSIGNED] [ZEROFILL], REAL[(*M*,*D*)\] [UNSIGNED] [ZEROFILL]

    这些类型是 的同义词 DOUBLE。例外:如果REAL_AS_FLOAT启用了 SQL 模式,REAL则是FLOAT而不是 的同义词DOUBLE

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论