numeric-type-syntax.md 12.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
### 11.1.1数字数据类型语法

[](<>)[](<>)[](<>)

对于整数数据类型,*`M`*指示最大显示宽度。最大显示宽度为255。显示宽度与类型可以存储的值的范围无关,如中所述[第11.1.6节,“数字类型属性”](numeric-type-attributes.html).

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

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

如果你指定`零填充`对于数字列,MySQL会自动添加`未签名`属性添加到该列。

从MySQL 8.0.17开始`零填充`属性不推荐用于数字数据类型;您应该期望在MySQL的未来版本中删除对它的支持。考虑使用另一种方法来产生这个属性的效果。例如,应用程序可以使用[`LPAD()`](string-functions.html#function_lpad)函数将焊盘编号归零至所需的宽度,也可以将格式化后的数字存储在[`烧焦`](char.html)柱。

允许`未签名`属性也允许`签署`。但是,这些数据类型在默认情况下是有符号的,因此`签署`属性没有效果。

从MySQL 8.0.17开始`未签名`属性不推荐用于类型为的列[`浮动`](floating-point-types.html), [`双重的`](floating-point-types.html)[`十进制的`](fixed-point-types.html)(以及任何同义词);您应该期望在MySQL的未来版本中删除对它的支持。考虑使用简单的`检查`而不是为此类列设置约束。

`电视连续剧`是的别名`BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE`.

`序列默认值`在整数列的定义中,是`非空自动增量唯一`.

警告

当在整数值之间使用减法时,其中一个为`未签名`,除非[`无符号减法`](sql-mode.html#sqlmode_no_unsigned_subtraction)SQL模式已启用。看见[第12.11节,“转换函数和运算符”](cast-functions.html).

-   [](<>) [](<>) [`一点点[(*`M`*)]`](bit-type.html)

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

-   [](<>) [](<>) [`TINYINT[(*`M`*)][未签名][零填充]`](integer-types.html)

    一个非常小的整数。符号范围为`-128`到`127`.无符号范围为`0`到`255`.

-   [](<>) [](<>) [](<>) [](<>) [`布尔`](integer-types.html), [`布尔值`](integer-types.html)

    这些类型是[`TINYINT(1)`](integer-types.html).零的值被认为是错误的。非零值被认为是真的:

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

    然而,价值观`符合事实的`和`错误的`不过是你的化名而已`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`.

-   [](<>) [](<>) [`斯莫林[(*`M`*)][未签名][零填充]`](integer-types.html)

    一个小整数。符号范围为`-32768`到`32767`.无符号范围为`0`到`65535`.

-   [](<>) [](<>) [`中微子[(*`M`*)][未签名][零填充]`](integer-types.html)

    一个中等大小的整数。符号范围为`-8388608`到`8388607`.无符号范围为`0`到`16777215`.

-   [](<>) [](<>) [`智力[(*`M`*)][未签名][零填充]`](integer-types.html)

    正常大小的整数。符号范围为`-2147483648`到`2147483647`.无符号范围为`0`到`4294967295`.

-   [](<>) [](<>) [`整数[(*`M`*)][未签名][零填充]`](integer-types.html)

    这种类型是[`国际的`](integer-types.html).

-   [](<>) [](<>) [](<>) [`比金[(*`M`*)][未签名][零填充]`](integer-types.html)

    一个大整数。符号范围为`-9223372036854775808`到`9223372036854775807`.无符号范围为`0`到`18446744073709551615`.

    `电视连续剧`是的别名`BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE`.

    你应该注意的一些关于[`比金`](integer-types.html)柱:

    -   [](<>)所有的算术都是用符号运算完成的[`比金`](integer-types.html)或[`双重的`](floating-point-types.html)值,因此不应使用大于`9223372036854775807`(63位)位功能除外!如果这样做,结果中最后的一些数字可能是错误的,因为在转换数据时存在舍入错误[`比金`](integer-types.html)价值观[`双重的`](floating-point-types.html).

        MySQL可以处理[`比金`](integer-types.html)在下列情况下:

        -   当使用整数将大的无符号值存储在[`比金`](integer-types.html)柱

        -   在里面[`闵(*`上校的名字`*)`](aggregate-functions.html#function_min)或[`麦克斯(*`上校的名字`*)`](aggregate-functions.html#function_max)哪里*`上校的名字`*指的是[`比金`](integer-types.html)柱

        -   使用运算符时([`+`](arithmetic-functions.html#operator_plus), [`-`](arithmetic-functions.html#operator_minus), [`*`](arithmetic-functions.html#operator_times),等等),其中两个操作数都是整数。

    -   您始终可以将精确的整数值存储在[`比金`](integer-types.html)通过使用字符串存储列。在本例中,MySQL执行字符串到数字的转换,不涉及中间的双精度表示。

    -   这个[`-`](arithmetic-functions.html#operator_minus), [`+`](arithmetic-functions.html#operator_plus)和[`*`](arithmetic-functions.html#operator_times)操作员使用[`比金`](integer-types.html)两个操作数都是整数值时的算术运算。这意味着,如果将两个大整数(或返回整数的函数的结果)相乘,当结果大于`9223372036854775807`.

-   [](<>) [](<>) [`小数点[(*`M`*[,*`D`*])][未签名][零填充]`](fixed-point-types.html)

    一个压缩的“精确”定点数字。*`M`*是总位数(精度)和*`D`*小数点后的位数(刻度)。小数点和(对于负数)`-`符号不算在内*`M`*如果*`D`*为0时,值没有小数点或小数部分。最大位数(*`M`*)因为[`十进制的`](fixed-point-types.html)她65岁。支持的最大小数位数(*`D`*)30岁。如果*`D`*如果省略,则默认值为0。如果*`M`*省略,默认值为10。(对文本的长度也有限制。)[`十进制的`](fixed-point-types.html)文字可以是;看见[第12.25.3节“表达式处理”](precision-math-expressions.html).)

    `未签名`,如果指定,则不允许负值。从MySQL 8.0.17开始`未签名`属性不推荐用于类型为的列[`十进制的`](fixed-point-types.html)(以及任何同义词);您应该期望在MySQL的未来版本中删除对它的支持。考虑使用简单的`检查`而不是为此类列设置约束。

    所有的基本计算(`+, -, *, /`)与[`十进制的`](fixed-point-types.html)列的精度为65位。

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [`十二月[(*`M`*[,*`D`*])][未签名][零填充]`](fixed-point-types.html), [`数字的[(*`M`*[,*`D`*])][未签名][零填充]`](fixed-point-types.html), [`固定的[(*`M`*[,*`D`*])][未签名][零填充]`](fixed-point-types.html)

    这些类型是[`十进制的`](fixed-point-types.html)这个[`固定的`](fixed-point-types.html)同义词可与其他数据库系统兼容。

-   [](<>) [](<>) [`漂浮[(*`M`*,*`D`*)][未签名][零填充]`](floating-point-types.html)

    一个小的(单精度)浮点数。允许值为`-3.4028234666E+38`到`-1.175494351E-38`, `0`和`1.175494351E-38`到`3.4028234666E+38`这些是基于IEEE标准的理论极限。根据硬件或操作系统的不同,实际范围可能会稍小一些。

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

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

    `未签名`,如果指定,则不允许负值。从MySQL 8.0.17开始`未签名`属性不推荐用于类型为的列[`浮动`](floating-point-types.html)(以及任何同义词),您应该期望在未来的MySQL版本中删除对它的支持。考虑使用简单的`检查`而不是为此类列设置约束。

    使用[`浮动`](floating-point-types.html)可能会给您带来一些意想不到的问题,因为MySQL中的所有计算都是以双精度完成的。看见[第B.3.4.7节,“解决没有匹配行的问题”](no-matching-rows.html).

-   [](<>) [](<>) [](<>) [`漂浮(*`p`*)[未签名][零填充]`](floating-point-types.html)

    浮点数。*`p`*以位表示精度,但MySQL仅使用此值来确定是否使用[`浮动`](floating-point-types.html)或[`双重的`](floating-point-types.html)用于生成的数据类型。如果*`p`*从0到24,数据类型变为[`浮动`](floating-point-types.html)没有*`M`*或*`D`*价值观如果*`p`*从25到53,数据类型变为[`双重的`](floating-point-types.html)没有*`M`*或*`D`*价值观结果列的范围与单个精度的范围相同[`浮动`](floating-point-types.html)还是双精度[`双重的`](floating-point-types.html)本节前面介绍的数据类型。

    `未签名`,如果指定,则不允许负值。从MySQL 8.0.17开始`未签名`属性不推荐用于类型为的列[`浮动`](floating-point-types.html)(以及任何同义词),您应该期望在未来的MySQL版本中删除对它的支持。考虑使用简单的`检查`而不是为此类列设置约束。

    [](<>) [](<>) [`漂浮(*`p`*)`](floating-point-types.html)提供语法是为了实现ODBC兼容性。

-   [](<>) [](<>) [](<>) [](<>) [`加倍[(*`M`*,*`D`*)][未签名][零填充]`](floating-point-types.html)

    正常大小(双精度)的浮点数。允许值为`-1.7976931348623157E+308`到`-2.2250738585072014E-308`, `0`和`2.2250738585072014E-308`到`1.7976931348623157E+308`这些是基于IEEE标准的理论极限。根据硬件或操作系统的不同,实际范围可能会稍小一些。

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

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

    `未签名`,如果指定,则不允许负值。从MySQL 8.0.17开始`未签名`属性不推荐用于类型为的列[`双重的`](floating-point-types.html)(以及任何同义词),您应该期望在未来的MySQL版本中删除对它的支持。考虑使用简单的`检查`而不是为此类列设置约束。

-   [](<>) [](<>) [](<>) [](<>) [`双精度[(*`M`*,*`D`*)][未签名][零填充]`](floating-point-types.html), [`真的吗[(*`M`*,*`D`*)][未签名][零填充]`](floating-point-types.html)

    这些类型是[`双重的`](floating-point-types.html).例外情况:如果[`真正的_AS_FLOAT`](sql-mode.html#sqlmode_real_as_float)SQL模式已启用,[`真实的`](floating-point-types.html)是的同义词[`浮动`](floating-point-types.html)而不是[`双重的`](floating-point-types.html).