本文解释 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 | mysql> SELECT IF(0, 'true', 'false'); |
但是,值 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
27mysql> 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 |
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 | CREATE TABLE t1 ( |
更多内容请查看: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