3.数据类型

予早 2025-08-31 14:59:18
Categories: Tags:

数据类型

数值类型

分为精确数字类型和近似数据类型。

精确数字类型:TINYINT、SMALLINT、MEDIUMINT、INTEGER、BIGINT

近似数据类型:FLOAT、DOUBLE、DECIMAL

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
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) 极大整数值
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) 单精度 浮点数值
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) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

[!TIP]

  1. 能用无符号就用无符号数字,既增加约束又增加有效范围。
  2. 枚举状态或分类(例如,1-待处理,2-成功,3-失败)优先选用无符号 TINYINT,组合状态或分类(例如,11213141,表示11类下的21子类下的31子类下的41子类)按需使用无符号 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
  3. 年份数据优先选用SMALLINT。
  4. 主键ID优先选用 BIGINT,避免自增ID用尽或者足够长以兼容分布式ID。
  5. 财务数据优先选用 DECIMAL,或者使用BIGINT和固定倍率常量(分、毫、厘)将数据扩大为整数。

mysql tinyint

Mysql tinyint(1)与tinyint(4)的区别

 CREATE TABLE `pre_demo` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
   `unsigned_t` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
   `signed_t` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
   `t1` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0',
   `t2` tinyint(2) unsigned zerofill NOT NULL DEFAULT '00',
   `t3` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
   `t4` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
   `t5` tinyint(5) unsigned zerofill NOT NULL DEFAULT '00000',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
 INSERT INTO pre_demo VALUES(NULL,8,8,8,8,8,8,8);
 INSERT INTO pre_demo VALUES(NULL,123,123,123,123,123,123,123);
 
 tinyint占一个字节
 tinyint(1) 与 tinyint(4) 能够存储的数据范围是一样的,都是 0 到 255(无符号的)。区别在于,当使用 zerofill 时,查询结果显示的长度可能不同。
 zerofill 和 指定长度配合使用,可用于统一数据的显示长度,比如在数据库层面快速生成统一长度的流水号。
 一般情况下,无须刻意指定整型数据类型的长度。使用 MySQL 的默认长度tinyint(4) 即可。

日期时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

时间日期类型

DATE、TIME、DATETIME、TIMESTAMP、YEAR

类型 大小 ( bytes) 范围 格式 用途
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 混合日期和时间值,时间戳 不携带时区信息,有时区转换,时间以会话时区被转换为UTC时区时间存储,查询时自动转为会话时区时间

[!TIP]

  • DATE:存储日期数据(例如,生日)
  • TIME:存储时间数据(例如,视频时长、工单处理耗时、任务执行时长),但不推荐使用该类型,而是使用整数+应用层格式化替代。
  • YEAR:存储年份数据(例如,报表年份),但不推荐使用该类型,而是用 SMALLINT 代替。
  • DATETIME:存储日期时间数据,不携带时区信息
  • TIMESTAMP:存储时间戳数据,不携带时区信息,但会有时区转换,但不推荐使用该类型,而是使用 DATETIME + 应用层 UTC 格式化替代

各时间类型转换

DATE
DATETIME
TIMESTAMP

SELECT FROM_UNIXTIME(1447430881);
SELECT FROM_UNIXTIME(1447430881) + 0;
SELECT FROM_UNIXTIME(1447430881, '%Y %D %M %h:%i:%s %x');

image-20241021215834372

NOW([fsp])

返回当前日期和时间,该值以会话时区表示。在不同计算上下文中以不同格式返回,如果给定fsp参数以指定从0到6的小数秒精度,则返回值包括该数字中的小数秒部分:

STR_TO_DATE(str,format)

DATE_FORMAT()函数的逆函数,参数为一个代表时间的字符串str,以及一个格式化字符串。该函数返回值取决于时间字符串str中包含的具体内容:

服务器扫描时间字符串str,试图将格式与之匹配。格式字符串可以包含以%开头的文字字符和格式说明符。格式中的文字字符必须与字符串中的文字匹配。格式中的格式说明符必须与字符串的日期或时间部分匹配。

UNIX_TIMESTAMP([date])

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');
SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');

image-20241021215810305

字符串类型

CHAR、VARCHAR

TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

[!TIP]

  • CHAR:适用于存储定长字符串(例如,MD5),或者长度相对均衡且需频繁查询的字符串(例如,国际手机区号)。
  • VARCHAR:适用于存储变长字符串(例如,产品名称、邮箱),
  • TINYTEXT:不使用该类型,使用 VARCHAR 代替。
  • TEXT:存储短文章(例如,电子邮件正文、新闻正文)
  • MEDIUMTEXT:存储长文章(例如,专业论文)
  • LONGTEXT:存储书籍()

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

二进制大对象(BLOBS BinaryLargeOBjects)

JSON

CREATE TABLE `dept` (
  `id` int(11) NOT NULL,
  `dept` varchar(255) DEFAULT NULL,
  `json_value` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into dept VALUES(1,'部门1','{"deptName": "部门1", "deptId": "1", "deptLeaderId": "3"}');
insert into dept VALUES(2,'部门2','{"deptName": "部门2", "deptId": "2", "deptLeaderId": "4"}');
insert into dept VALUES(3,'部门3','{"deptName": "部门3", "deptId": "3", "deptLeaderId": "5"}');
insert into dept VALUES(4,'部门4','{"deptName": "部门4", "deptId": "4", "deptLeaderId": "5"}');
insert into dept VALUES(5,'部门5','{"deptName": "部门5", "deptId": "5", "deptLeaderId": "5"}');
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5';
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5' and dept='部门3';
SELECT * from dept WHERE json_value->'$.deptLeaderId'='5' and json_value->'$.deptId'='5';

返回指定字段

select id,json_extract(json_value,'$.deptName') as deptName from dept;

包含某个对象

select * from dept WHERE JSON_CONTAINS(json_value, JSON_OBJECT("deptName","部门5"))
SELECT JSON_KEYS(json_value) FROM dept 

https://blog.csdn.net/asd529735325/article/details/107205214

json字段上的索引

https://blog.csdn.net/BREATH57/article/details/129320951