写在前面:部分内容摘抄于冰河的MySQL运维大全
一.数值类型
1.1 整数类型
1.1.1整数类型所需的存储空间
1.1.2整数类型的数值范围
备注:1.整数类型的显示宽度与数据类型的取值范围无关,显示宽度只是指定最大显示的数字个数。如果插入的数据大于显示宽度,但没有超过整数类型的取值范围,依然可以正确插入,并正确显示
2.显示宽度可以配合ZEROFILL使用,ZEROFILL在数字显示位数不够时,用0进行填充
1.2 浮点数类型
1.2.1浮点数占用空间
1.2.2浮点数取值范围
备注:1.浮点数可以使用(M,D)的方式进行表示,(M,D)表示当前数的整数位和小数位一共显示M位数字,其中,小数点后会显示D位数字,M被称为精度,D被称为标度
2.如果插入的数字超出浮点数的精度范围,会被四舍五入
1.3 定点数类型
DECIMAL:DECIMAL也可以使用(M,D)进行表示,M被称为精度,是数据的总位数;D被称为标度,表示数据的小数位所占的位数。定点数在MySQL内部是以字符串的形式进行存储的,它的精度比浮点数更加精确,适合存储表示金额
二.日期和时间类型
日期和时间类型占用的存储空间
日期和时间类型表示的范围
每种日期和时间类型都有一个有效值范围,如果超出范围,则会以0进行存储,以下是零值表示
2.1 YEAR类型
在MySQL中,YEAR有以下几种存储格式:
4位字符串,格式为YYYY,最小值为1901,最大值为2155
2位字符串,最小值为00,最大值为99。其中,当取值为00到69时,表示2000到2069;当取值为70到99时,表示1970到1999。如果插入的数据超出了取值范围,则MySQL会将值自动转换为2000
2.2 TIME类型
TIME类型用来表示时间,不包含日期部分。
在MySQL插入TIME类型的数据,有几种不同的格式
(1)带有冒号的字符串,比如D HH:MM:SS、HH:MM:SS、HH:MM、D HH:MM、D HH或SS格式,D表示天,取值范围0-34。如果使用带有D格式的字符串插入TIME类型的字段,D会被转化为小时,计算格式为D*24+HH
(2)不带有冒号的字符串或者数字,格式为"HHMMSS"或者HHMMSS,如果插入不合法,存储数据时会将其自动转化为00:00:00进行存储
(3)使用CURRENT_TIME或者NOW(),插入当前系统的时间
2.3 DATE类型
DATE类型表示日期,没有时间部分,格式为YYYY--MM-DD,其中YYYY表示年份,MM表示月份,DD表示日期,在向DATE类型的字段插入数据时,需要满足一定的格式条件
以YYYY-MM-DD或者YYYYMMDD格式表示的字符串日期,最小取值为1000-01-01,最大取值为9999-12-03
以YY-MM-DD或者YYMMDD格式表示的字符串日期,年份部分跟YEAR类型一致:当年份取值为00到69时,会被转化为2000到2069;当年份取值为70-99时,会被转化为1970到1999
2.4 DATETIME类型
所有日期时间类型中占用存储空间最大,需要8个字节
格式:以YYYY-MM-DD HH:MM:SS格式或者YYYYMMDDHHMMSS格式的字符串插入DATETIME类型的字段时,最小值为1000-01-01 00:00:00,最大值为9999-12-03 23:59:59
以YY-MM-DD HH:MM:SS格式或者YYMMDDHHMMSS格式的字符串插入DATETIME类型的字段时,年份符合YEAR类型的规则,不再赘述
2.5 TIMESTAMP类型
存储范围:"1970-01-01 00:00:00 UTC" 到 "2038-01-19 03:14:07 UTC"。其中,UTC表示世界统一时间;TIMESTAMP在存储的时候是根据世界统一时间存储的,存储数据得时候需要对当前时间所在的时区进行转换,查询的时候要将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同时区查询时会显示不同的时间
三.文本字符串类型
文本字符串类型所占存储空间
3.1 CHAR与VARCHAR类型
CHAR插入时如果实际长度比声明长度小,则在右侧进行填充,CHAR类型进行检索时,会去掉尾部空格
VARCHAR是可变长的字符串,进行检索时,不会去掉尾部空格
3.2 TEXT类型
在MySQL中,Text用来保存文件类型的字符串,一共四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,TEXT类型的字段保存和查询数据时,不会删除尾部的空格
3.3 ENUM类型
ENUM类型的取值范围需要定义字段时进行指定
3.4 SET类型
SET表示一个字符串对象,可以包含0~64个成员,根据成员个数的不同,所占用存储空间也是不同的。以下为SET类型所占空间
注意:SET类型在选取成员时,可以选择多个成员,这点与ENUM不同,会去掉重复的成员
3.5 JSON类型
MySQL 5.7开始支持JSON类型,MySQL 8.x版本中,JSON类型提供了进行自动验证的JSON文档和优化的存储结构。当要检索JSON类型的字段中某个数据的具体值,可以使用"->"和"->>"符号
如:mysql> SELECT j->'.address.province' AS province, j->'$.address.city' AS city FROM t19; +----------+-----------+-----------+ | name | province | city | +----------+-----------+-----------+ | "binghe" | "sichuan " | "chengdu" | +----------+-----------+-----------+ 1 row in set (0.01 sec)
四.二进制字符串类型
二进制字符串类型占用空间