1、MySQL 数据类型
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
1.2、查看Mysql编码格式
mysql> show variables like "%char%";
+--------------------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------------------------------+
9 rows in set (0.00 sec)
MySQL 配置文件中字符集相关变量
- character_set_client:客户端请求数据的字符集
- character_set_connection:从客户端接收到数据,然后传输的字符集
- character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server 指定的字符集,这个变量建议由系统自己管理,不要人为定义。
- character_set_filesystem:把操作系统上的文件名转化成此字符集,即把 character_set_client 转换 character_set_filesystem, 默认 binary 是不做任何转换的
- character_set_results:结果集的字符集
- character_set_server:数据库服务器的默认字符集
- character_set_system:存储系统元数据的字符集,总是 utf8,不需要设置
2、Mysql字符串类型
MySQL 提供了 8 个基本的字符串类型,包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。
类型 | 大小 | 用途 | 对应java类 |
CHAR | 0-255 bytes(字节) | 定长字符串 | String |
VARCHAR | 0-65535 bytes | 变长字符串 | String |
TINYTEXT | 0-255 bytes | 短文本字符串 | String |
TEXT | 0-65 535 bytes | 长文本数据 | String |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 | String |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 | String |
2.1、mysql中编码和字符
在 mysql 中,一个中文汉字所占的字节数与编码格式有关:
- 如果是GBK编码,则一个中文汉字占2个字节,英文占1个字节
- 如果是UTF8编码,则一个中文汉字占3个字节,而英文字母占1字节。
如果是UTF8mb4编码
:
则
一个英文字符占一个字节,中文3字节,单字符最大占4个字节(如emoji表情4字节)。
UTF-8的补充:
MySQL 中的 utf8 与 utf8mb4
- MySQL 支持的 utf8 编码最大字符长度为 3 字节
- MySQL utf8 编码中,4 字节的宽字符会插入异常,例如一些不常用的汉字
- MySQL 5.5.3 版本以后支持 utf8mb4
- utf8mb4 是 utf8 的超集,从旧版本的 MySQL utf8 升级数据为 utf8mb4 时, 不用担心字符转换或丢失数据
utf8mb4_unicode_ci 与 utf8mb4_general_ci
- MySQL 8.0 以前 utf8mb4_general_ci 是默认排序规则
- 对中文、英文来说没有实质差别,用 utf8_general_ci 就可以
- utf8mb4_unicode_ci 在特殊情况下,Unicode 排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法
- utf8mb4_general_ci 比对速度快,但准确度稍差
- 如果应用有德语、法语或者俄语,一定使用 utf8_unicode_ci
utf8mb4_0900_ai_ci
- MySQL 8.0.1 及更高版本中默认使用,属于 utf8mb4_unicode_ci 中的一种
- 0900 指的是 Unicode 校对算法版本
- ai 指口音不敏感,例如排序时 e,è,é,ê 和 ë 之间没有区别
- ci 表示不区分大小写,例如排序时 p 和 P 之间没有区别
- 如果需要口音敏感和区分大小写,可以使用 utf8mb4_0900_as_cs
- 可以存储表情符号,Emoji 占用四个字节
总结
- 新项目尽量使用 utf8mb4 兼容多种语言的字符,例如 utf8mb4_general_ci
- MySQL 8.0 之前的版本,如果项目可能包含其他语言,一定使用 utf8mb4_unicode_ci
- MySQL 8.0 之后的版本,一般使用默认的 utf8mb4_0900_ai_ci 即可
- 在使用 utf8mb4 时,使用 varchar 替换 char 能节省空间( char 采用固定长度的存储方式)
2.2、CHAR和VARCHAR类型
1、固定长度 & 可变长度
VARCHAR
VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。
有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储。
CHAR
CHAR类型用于存储固定长度字符串:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除字符串中的末尾空格(在MySQL 4.1和更老版本中VARCHAR 也是这样实现的——也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,区别只是在存储格式上)。
同时,CHAR值会根据需要采用空格进行剩余空间填充,以方便比较和检索。但正因为其长度固定,所以会占据多余的空间,也是一种空间换时间的策略;
2、存储方式
VARCHAR
VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002 个字节,因为需要2个字节存储长度信息。
VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MylSAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。
CHAR
CHAR适合存储很短或长度近似的字符串。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。
3、存储容量
CHAR
对于char类型来说,最多只能存放的字符个数为255,和编码无关,任何编码最大容量都是255。
VARCHAR
MySQL行默认最大65535字节,是所有列共享(相加)的,所以VARCHAR的最大值受此限制。
表中只有单列字段情况下,varchar一般最多能存放(65535 - 3)个字节,varchar的最大有效长度通过最大行数据长度和使用的字符集来确定,通常的最大长度是65532个字符(当字符串中的字符都只占1个字节时,能达到65532个字符);
为什么是65532个字符?算法如下(有余数时向下取整):
最大长度(字符数) = (行存储最大字节数 - NULL标识列占用字节数 - 长度标识字节数) / 字符集单字符最大字节数
NULL标识列占用字节数:允许NULL时,占一字节
长度标识字节数:记录长度的标识,长度小于等于255(28)时,占1字节;小于65535时(216),占2字节详细可以参考作者写过的,mysql一行数据是如何存储的
VARCHAR类型在4.1和5.0版本发生了很大的变化,使得情况更加复杂。从MySQL 4.1开始,每个字符串列可以定义自己的字符集和排序规则。这些东西会很大程度上影响性能。
- 4.0版本及以下,MySQL中varchar长度是按字节展示,如varchar(20),指的是20字节;
- 5.0版本及以上,MySQL中varchar长度是按字符展示。如varchar(20),指的是20字符。
当然,行总长度还是65535字节,而字符和字节的换算,则与编码方式有关,不同的字符所占的字节是不同的。
4、小结
常用的字符串类型的数据类型有 CHAR 和 VARCHAR 两种,两者后面都必须要跟上一个数字表示长度,例如 CHAR(10)、VARCHAR(10)。
char(n) 和 varchar(n) 括号中的 n 代表最大可容纳的字符的个数,并不代表字节个数。注意,一个中文和一个英文都是 1 个字符,只不过 mysql 的编码格式不同时,1 个中文和 1 个英文所占用的存储字节不同而已。(虽然在早期的版本中,n 指的是字节数,但已经是非常旧的版本了,估计一般人也用不到)
CHAR(n) 和 VARCHAR(n) 都是表示可存储 n 个字符,但是 char 类型在少于 n 个字符时,会在字符串的右边使用空格来填充以达到 n 个字符。
比如:CHAR(4) 和 VARCHAR(4) ,对于 CHAR(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,如果超过4个字符,会自动截断超出部分。例如你存入数据为 'ab' ,实际会存入 'ab ' (ab后有2个空格)。但是如果我们使用 select 语句来查询 char 类型的字段时,会发现根本就没有自动补空格,这是因为 CHAR 字段在检索输出时,会自动省略右侧的空格。
VARCHAR 是 CHAR 类型的一个变体,它是一种可变长度的字符串类型,并且在声明时也必须要指定字符长度。VARCHAR 类型对于未达到 n 字符的情况不会补空。
CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理这个指示器(即 n)的方式:CHAR 把这个大小视为值的大小,在长度不足的情况下就用空格补足。而 VARCHAR 类型只会把 n 作为限制字符串的最大长度,短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。
关于计算 VARCHAR 类型字符串的占用空间,有一点需要说明的是, VARCHAR 类型字符串的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据占用的空间,例如 VARCHAR 类型会使用1个字节记录存入数据实际的字符数。
比如下面示例说明 varchar 字段的字符长度和占用存储字节数:
(1) 'a啊b' —— 字符数为3,不补空,实际存入为 'a啊b' ,字符数为3,字节数为 1+3+1=5 。
(2)'a啊b哈ccccccccc' —— 字符数超出4,仅保留前4个字符,因此实际存入 'a啊b哈' ,字符数:4,字节数:1+3+1+3=8 。这种情况和 CHAR 类型处理一致。
(3)'a啊和哈' —— 字符数刚好为4,不需要截断和补齐,因此实际存入 'a啊和哈' ,字符数:4,字节数:1+3+3+3=10
两者的使用场景:因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。但如果确切知道字符串长度,比如就在50~55之间,那就用 CHAR,因为 CHAR 类型由于本身定长的特性使其性能要高于 VARCHAR。
3、数值类型
MySQL 支持所有标准 SQL 数值数据类型,mysql 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)
在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。浮点型有:FLOAT、DOUBLE、DECIMAL。
下面的表显示了需要的每个数值类型的存储所占用的字节和可表示的数值范围
1 bit 即 1位 1字节 = 8 bit 1K = 1024字节 1M = 1024K
类型 | 大小 | 范围(有符号,默认) | 范围(无符号) | 用途 | 对应java类 |
TINYINT | 1 Byte | (-128,127) | (0,255) | 小整数值 一个很小很小的整数 | Integer |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 一个小整数 | Integer |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 一个中等大小的整数 | Integer |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 一个int大小的整数 (大都用来做id) | Integer |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 一个蛮大的整数(也常用来做id) | Long |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度,浮点数值。 学生成绩、允许有误差的、单精度浮点数 | Float |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度,浮点数值。 学生成绩、允许有误差的、双精度浮点数 | Double |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 例如定义 DECIMAL(5,2) ,则表示最大位数为5位,小数点后2位,于是取值范围为 -999.99至999.99 | 依赖于M和D的值 | 小数值。 用来计算工资、盈利、金融方面 | Java.math.BigDecimal |
比如 INT 类型,该类型所占字节为 4 个字节。比如数据库中某列的字段类型为 INT,则每条数据的该列的数据都会占服务器容量的 4 个字节的存储容量,并且该列所能显示的数值范围只能是 -128~127 ,或者如果该列是无符号的话,则范围是 0~255。如果你存储超出最大范围则会提示 out of range value ....,比如往 INT 且有符号的数据类型里面存储 2147483648 的值,则会报错并且不会存储成功。
3.1、整数类型的长度
常用的整数数据类型有 tinyint ,smallint ,mediumint , int ,bigint 共计5种。
在声明整数类型列时,我们可以跟上一个数值,例如 int(n) ,但实际上这里的 n 跟存储没有什么关系,无论 n 是什么,INT 数据类型都是 4 个字节,只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。
在mysql手册中这个 n 表示最大显示宽度,显示宽度与存储大小和数据类型所能包含的值的范围无关,最大有效的显示宽度是255,即 n 的值最大是 255。
比如我声明一个字段为 `number` INT(5) ,此时该 number 字段也是占 4 个字节,也只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。这个 n 的作用只有在我们给列加上 ZEROFILL(用 0 填充)属性时才会体现出来,并且只有在使用一些特定的客户端输出时才会有体现。比如:
--加上zerofill属性则必须同时加unsigned属性
`number`int(5)unsigned zerofill
此时,当该列某条数据的数字小于 5 位时,在某些特定的客户端检索输出时,会在数字前 “补0”,凑足5位数字。例如存储的数字是123,那么输出00123 。如果大于 5 位则原样显示原数字。
注意,不是在数据库中存储时会自动补 0 ,而是在某一些客户端查询输出时才有显示效果,目前仅发现使用在MySQL Shell才有显示效果,其他客户端连接时均无。
所以说,基本没有开发者会使用这个特性,因为基本没什么用。
3.2、浮点型
FLOAT 类型固定占用4个字节, DOUBLE 类型固定占用8个字节,逻辑和上述的整型类似。
DECIMAL 类型的定义方式是 DECIMAL(M,D) ,其中 M 表示最大位数,D 表示小数点右侧的位数。这里的“位”不是二进制的比特位,而是指十进制的数字的位数。
例如我们定义 DECIMAL(5,2) ,则表示最大位数为5位,小数点后2位,于是取值范围为 -999.99至999.99 。可以这样理解:M-D 的值为小数点前的位数,D 的值为小数点后的位数,要算取值范围则各个位置填充9,取正负范围。那么容易计算 DECIMAL(5,1) 的取值范围是 -9999.9至9999.9 ;DECIMAL(4,2) 的取值范围是 -99.99至99.99 。
DECIMAL(M,D) 的存储方式和其他数字类型都完全不同,它是以字符串形式进行存储的。这可能有点不好理解,以整型 tinyint 为例,它存储的值是直接为十进制到二进制的转换,以无符号型为例,当需要存入的值为100值,将100转化为二进制为1100100 ,使用1个字节即8位记录,实际存入的是 01100100 。但是用 DECIMAL 类型存储时,比如定义 DECIMAL(3,0) ,存入100时,实际存入的是由字符“1”,“0”,“0”拼接而成的字符串“100”的二进制值,存入时占用3个字节,分别是31,30,30(注意这是十六进制)。 1个数字字符占用1个字节,因此定义为 DECIMAL(M,D) 占用 M 个字节。(同上所述,M个字节为数据本身的占用空间,另外描述该数据的元数据还固定占用2个字节的空间)。 需要注意的是, DECIMAL 类型在存储时有补0操作。小数点前不足,向更高位补0,小数点后不足,向更低位补0。 以 DECIMAL(5,2) 为例,如果准备存入9.5,小数点前应为3位,缺2位,小数点后应为2位,缺1位,各补0后,实际存入 '009.50' ,转化为十六进制为30 30 39 2E 35 30 。但是在检索输出时,小数点前的0一般会省略,而小数点后的0会保留,这一点也需要注意。
可参考:https://zhuanlan.zhihu.com/p/111028232
4、日期和时间类型
在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期(DATE)、时间类型(TIME)、年份(YEAR)、混合日期(DATETIME)、时间类型(TIMESTAMP)。
每一个时间、日期类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。
类型 | 大小 ( 固定长度、单位为字节) | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD(年月日) | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS(时分秒) | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS(年月日时分秒) | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
这个时间的对应的Java类、只要格式正确、都是可以取的,主要看需求是什么。不管你后端是String、Date 类型、只要格式是对应的就是可以的。
4.1、DATETIME
DATETIME类型后面可以接后缀,当然也可以没有,如datetime、datetime(3)、datetime(6),这个后缀是用来定义毫秒的精度的。这个后缀最大是6,超过就会报错。
假设建表语句为:
则存储结果分别为:
优点:
- DATETIME 没有存储的时间上限,可以存储完整的日期和时间信息,而TIMESTAMP存储的时间上限只能到‘2038-01-19 03:14:07’
缺点:
- DATETIME 不带时区属性,需要前端或者服务端处理,但是仅从数据库保存数据和读取数据而言,性能更好
- 不能自动更新,需要手动更新
4.2、TIMESTAMP
- TIMESTAMP 用于表示 年月日 时分秒,但是记录的年份(见上表)比较短暂。
- TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是 不一样的。
- TIMESTAMP 列可以自动设置为系统时间(CURRENT_TIMESTAMP)。当插入或更新一行,但没有明确给 TIMESTAMP 列赋值,也会自动设置为当前系统时间。如果表中有第二个 TIMESTAMP 列,则默认值设置为0000-00-00 00:00:00。
- TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。
- 如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
优点:
最大的优点是可以带有时区属性,因为它本质上是从毫秒转化而来。如果你的业务需要对应不同的国家时区,那么类型 TIMESTAMP 是一种不错的选择。比如新闻类的业务,通常用户想知道这篇新闻发布时对应的自己国家时间,那么 TIMESTAMP 是一种选择。Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样。
同时支持自动更新,不需要进行重复赋值。
比如,我们在建表需要有一个字段表示落库的最终时间
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
....
`time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
缺点:
TIMESTAMP 的性能问题
虽然从毫秒数转换到类型 TIMESTAMP 本身需要的 CPU 指令并不多,这并不会带来直接的性能问题。但是如果使用默认的操作系统时区,则每次通过时区计算时间时,要调用操作系统底层系统函数 __tz_convert(),而这个函数需要额外的加锁操作,以确保这时操作系统时区没有修改。所以,当大规模并发访问时,由于热点资源竞争,会产生两个问题:
- 性能不如 DATETIME:DATETIME 不存在时区转化问题。
- 性能抖动:海量并发时,存在性能抖动问题。
为了优化 TIMESTAMP 的使用,建议使用显式的时区,而不是操作系统时区。比如在配置文件中显示地设置时区,而不要使用系统时区。
4.3、补充数值时间戳(int/BigInt)
除了用Mysql自带的时间类型还可以通过时间戳进行表示时间,也就是通过int或者BigInt这种数值类型去代表一个时间戳。
优点:
这种存储方式的具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,毕竟只是存放的数值。
缺点:
是数据的可读性太差了,你无法直观的看到具体时间。
需要通过相关命令进行转化,或者在服务端进行转化
命令如下:
mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-01-11 09:53:32') |
+---------------------------------------+
| 1578707612 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> select FROM_UNIXTIME(1578707612);
+---------------------------+
| FROM_UNIXTIME(1578707612) |
+---------------------------+
| 2020-01-11 09:53:32 |
+---------------------------+
1 row in set (0.01 sec)
如果需要查看某个时间段数据:
select * from t where created_time > UNIX_TIMESTAMP('2024-06-01 00:00:00');
问题:Mysql中如何选择合适类型存储时间的时间?
那么现在我们可以用三种方式表示时间:DateTime、Timestamp、时间戳三种类型。究竟选择哪一种方式?
答案:看具体的业务场景,没有银弹。
下面我会从,存储,性能,兼容性方面给出一些解答
- 存储需求:如果您的应用程序需要存储完整的日期和时间信息,并且不受时区影响,那么datetime是一个好选择。如果您需要更高的灵活性,可以在不同的系统之间轻松转换日期和时间,那么bigint可能更适合您。如果您希望MySQL自动更新日期和时间,并且需要处理时区转换,那么timestamp是最佳选择。
- 性能:在大多数情况下,datetime和timestamp的性能差异可以忽略不计。然而,如果您需要频繁地进行日期和时间计算,那么bigint可能会提供更好的性能,因为它允许您直接对整数进行运算。
- 兼容性:如果您正在使用第三方库或工具,并且它们依赖于特定的日期和时间格式,那么您可能需要选择与这些库或工具兼容的类型。
最后给一下《高性能 MySQL 》的作者推荐 的是Timestamp
5、二进制数据类型
主要包含下列几种数据类型:tityblob,blob,mediumblob,longblob。
mysql类型名 | 描述 |
tityblob | 不超过 255 个字符的二进制字符串 |
blob | 二进制形式的长文本数据 |
mediumblob | 二进制形式的中等长度文本数据 |
longblob | 二进制形式的极大文本数据 |
参考文献
Character Sets and Collations in MySQL
MySQL 几种编码格式的区别
全面了解 mysql 中 utf8 和 utf8mb4 的区别
https://www.cnblogs.com/wenxuehai/p/15600562.html
https://blog.csdn.net/qq_39390545/article/details/109379218
MySQL中的时间类型选择:datetime、bigint还是timestamp?
MySQL中四种存储日期类型的比较与选择_mysql date类型比较-CSDN博客
滑动验证页面