MySQL 8 - Data Types(数据类型)

本文解释 MySQL 8 所支持的数据类型~

MySQL 支持的数据类型可以分为以下几大类:

  • Numeric Data Types —— 数字类型
  • Date and Time Data Types —— 日期和时间类型
  • String (character and byte) types —— 字符串(字符和字节)类型
  • Spatial Data Types —— 空间类型
  • JSON Data Type —— JSON 数据类型

接下来对数据类型描述会使用以下约定:

  • 对于 integer(整数) 类型,M 指示最大显示宽度。
    对于 floating-point(浮点型) 和 fixed-point(定点数),M 是可以总存储的进度。
    对于 string(字符串) 类型,M 是最大长度。
    M 的最大允许值取决于数据类型。

  • D 适用于floating-point(浮点型) 和 fixed-point(定点数)类型,并指示小数点(比例)之后的数字数。
    最大值为 30,但不应大于 M-2。

  • fsp 适用于时间、日期时间和时间戳类型,表示小数秒精度。也就是说,秒分数部分小数点之后的数字数。
    fsp 值(如果给定)必须在 0 到 6 之间。值为 0 表示没有小数部分。如果省略,则默认精度为 0。

  • 方括号 ([ ]) 表示类型定义的可选部分。

Numeric Data Types —— 数字类型

对于 integer(整数) 类型,M 指示最大显示宽度。最大显示宽度是 255,显示宽度与类型可以存储的值范围无关。
对于 floating-point(浮点型),M 是可存储的总数。

在 MySQL 8 不推荐给 integer(整数) 设置长度,而且未来的 MySQL 可能移除
在 MySQL 8 不推荐给 数值类型 设置 ZEROFILL,而且未来的 MySQL 可能移除
在 MySQL 8 不推荐给 FLOAT, DOUBLE, DECIMAL 设置 UNSIGNED,而且未来的 MySQL 可能移除

integer(整数) 类型

  • BIT[(M)]
    位值类型。M 表示每个值的位数,从 1 到 64。如果省略 M,默认值为 1。

  • TINYINT[(M)] [UNSIGNED]
    一个很小的整数。签名范围为 -128 到 127。未签名的范围为 0 到 255。

  • BOOL, BOOLEAN
    这些类型是 TINYINT(1) 的同义词。零值被视为 false。非零值被视为 true:
    为什么不是 BIT(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 的别名,如下所示:

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
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]
    一个小整数。有符号值的范围为 -32768 到 32767。无符号值的范围为 0 到 65535。

  • MEDIUMINT[(M)] [UNSIGNED]
    中等大小的整数。有符号值的范围为 -8388608 至 8388607。无符号值的范围为 0 到 16777215。

  • INT[(M)] [UNSIGNED]
    一个正常大小的整数。有符号值的范围为 -2147483648 至 2147483647。无符号值的范围为 0 到 4294967295。

  • INTEGER
    此类型是 INT 的同义词。

  • BIGINT[(M)] [UNSIGNED]
    大整数。有符号值的范围为 -9223372036854775808 至 9223372036854775807。无符号值的范围为 0 到 18446744073709551615。

  • SERIAL
    是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名

关于 BIGINT 列,您应该注意的一些情况:

  • 所有算术都应该使用有符号的 BIGINT 或 DOUBLE 的值,因此除了位函数外,不应使用大于 9223372036854775807 (63 bits) 的无符号 BIGINT!如果这样做,结果中某些最后数字可能是错误的,因为将 BIGINT 值转换为 DOUBLE 时出现舍入错误。

    MySQL 可以在以下情况下处理 BIGINT:

    • 使用整数在 BIGINT 列中存储较大的未符号值时。
    • 在 MIN(col_name) 或 MAX(col_name)中 col_name 引用 BIGINT 列。
    • 当使用运算符(+,-,* 等)时,其中两个操作数都是整数。
  • 你可以存在字符串 ‘123456789’ 到一个 BIGINT 列中,MySQL 会执行字符串到数字的转换。

  • 当使用运算符(+,-,* 等)计算两个大数值时,小心数值超标!

不推荐使用无符号的 BIGINT,很多语言库,获取文件长度返回的都是有符号的 long(int64) 类型,而不是无符号 ulong(uint64) 类型,文件长度怎么可能是负数呢?但还是使用有符号类型~

MySQL 与 C# 类型 的映射:

MySQL 类型 C# 类型
TinyInt sbyte
SmallInt short
MediumInt
Int int
BigInt long

floating-point(浮点型) 类型

  • DECIMAL[(M[,D])]

打包的“精确”定点数,M 是数字总数(精度),D 是小数点(刻度)之后的数字数。
小数点 . 和 负数 - 符号不计入 M 中。如果 D 为 0,则值没有小数点或小数部分。
DECIMAL 的 M 最大数位数为 65。支持的小数 D 的最大数位数为 30。
如果省略 D,则默认值为 0。如果省略 M,则默认值为 10。

_对于浮点型 UNSIGNED 不推荐使用,将来版本会移除~
对于浮点型 ZEROFILL 不推荐使用,将来版本会移除~
DEC[(M[,D])], NUMERIC[(M[,D])], FIXED[(M[,D])],这些类型是 DECIMAL 的同义词~
FLOAT(M,D)是一个非标准 MySQL 扩展,将来版本会移除~
DOUBLE(M,D)是一个非标准 MySQL 扩展,将来版本会移除~
DOUBLE PRECISION[(M,D)], REAL[(M,D)],这些类型是 DOUBLE 的同义词~ _

  • FLOAT(p)
    浮点数类型,p 表示位精度,但 MySQL 仅使用此值来确定对生成的数据类型是使用 FLOAT 还是 DOUBLE。
    如果 p 从 0 到 24,则数据类型将变为没有 M 或 D 值的 FLOAT。
    如果 p 从 25 到 53,则数据类型变为没有 M 或 D 值的 DOUBLE。

貌似 MySQL 能用的浮点数类型只有 DECIMAL 了

MySQL 与 C# 类型 的映射:

MySQL 类型 C# 类型
Decimal decimal

Date and Time Data Types —— 日期与时间类型

表示日期和时间的时间类型有:DATE(日期)、TIME(时间)、 DATETIME(日期时间)、TIMESTAMP(时间戳)
每个时间类型都有一系列有效值,当您指定无效值时 MySQL 可以会使用的 “零” 值
TIMESTAMP(时间戳)和DATETIME(日期时间)类型具有特殊的自动更新行为

1
2
3
4
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);

更多内容请查看:https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html

日期与时间相关的函数:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

使用日期和时间类型时,请记住以下一般注意事项:

  • MySQL 以标准输出格式检索给定日期或时间类型的值,但它尝试解释您提供的各种输入值的格式:

    • ‘2012-12-31 11:30:45’, ‘2012^12^31 11+30+45’
    • ‘2012/12/31 113045’, ‘2012@12@31 11^30^45’
  • 尽管 MySQL 尝试以多种格式解释值,但日期部分必须始终以 year-month-day 给出~

  • 不要使用 2个 数字表示年份!

参考资料

[官方文档 - Chapter 11 Data Types] https://dev.mysql.com/doc/refman/8.0/en/data-types.html

觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/mysql/data-types/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除