ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL数据库基础(4):数据类型

MySQL数据库基础(4):数据类型 雨落在了我的手上个人主页个人仓库Gitee仓库❄️个人专栏JaveSe C语言 C语言数据结构Java数据结构MySQL数据库基础 人生格言无人扶我青云志我自踏雪至山巅博主简介目录一本节⽬标二常⽤数据类型分类三数据值类型1.类型列表2.数据类型取值范围四字符串类型1.类型列表2.关于排序3.CHAR与VARCHAR的区别4.VARCHAR与TEXT的区别五⽇期类型1.类型列表2.其他内容大纲本文系统介绍了SQL中常用的数据类型涵盖数据值、字符串、二进制及日期四大类。重点解析了整型、浮点型、CHAR与VARCHAR的区别、TEXT适用场景、以及TIMESTAMP、DATETIME等日期类型的特点与使用规范。通过实例演示帮助理解各类型在存储、性能和应用场景上的差异为数据库设计中的字段类型选择提供实用指导。一本节⽬标• 掌握数据类型分类• 掌握常⽤数据类型二常⽤数据类型分类在⾯向对象软件开发的过程中通常会先进⾏需求分析从⽽得到类和属性类是⾯向对象中的概 念对应到数据库中的概念就是实体类中的属性对应实体中的属性。实体通常以表的形式存在每 个实体对应⼀张表表中的每条记录(数据⾏)就是实体的⼀个实例每条记录⼜包含若⼲字段(或称为 列)每个字段代表实体的⼀个属性。如果要定义实体的属性就要为属性命名并指定合适的数据类型。与其他编程语⾔类似SQL中 规定了⽤于描述属性的数据类型。常⽤的数据类型有以下⼏类• 数据值类型• 字符串类型• ⼆进制类型• ⽇期类型三数据值类型1.类型列表类型大小说明BIT[(M)]默认 bit位值类型。M表示每个值的位数取值范围为 1 64 。如果省略M则默认为 1 。TINYINT[(M)]1byte取值范围 -2^7 2^7-1 无符号取值范围 2^8-1BOOL1byteTINYINT(1)的同义词。值为零被认为是假非零值被认为是trueSMALLINT[(M)]2byte取值范围 -2^15 2^15-1 无符号取值范围 2^16-1 。MEDIUMINT[(M)]3byte取值范围 -2^23 2^23-1 无符号取值范围 2^24-1INT[(M)]4byte取值范围 -2^31 2^31-1 无符号取值范围 2^32-1INTEGER[(M)]4byteINT[(M)]的同义词BIGINT[(M)]8byte取值范围 -2^63 2^63-1 无符号取值范围 2^64-1FLOAT[(M,D)]4byte单精度浮点型M是总位数D是小数点后面的位数大约可以精确到小数点后7位DOUBLE[(M,D)]8byte双精度浮点型M是总位数D是小数点后面的位数大约可以精确到小数点后15位。DECIMAL[(M[,D])]动态不存在精度损失M是总位数D是小数点后的位数。DECIMAL的最大位数(M)为65最大小数位数(D)为30。如果省略M则默认为10如果省略D则默认为0。M中不计算小数点和负数的-号如果D为0则值没有小数点和小数部分。2.数据类型取值范围类型大小有符号最小值有符号最大值无符号最小值无符号最大值TINYINT1Byte-1281270255SMALLINT2Byte-3276832767065535MEDIUMINT3Byte-83886088388607016777215INT4Byte-2147483648214748364704294967295BIGINT8Byte-2^632^63-102^64-1四字符串类型1.类型列表类型说明CHAR[(M)]固定长度字符串M 表示长度以字符为单位取值范围 0 255 M 省略则长度为 1VARCHAR(M)可变长度字符串M 表示字符最大长度取值范围 0 65535 有效字符个数取决于实际字符数和使用的字符集TINYTEXT小文本类型最大长度为 255 (2^8-1)个字节有效字符个数取决于使用的字符集TEXT[(M)]文本类型最大长度为 65535 (2^16-1)个字节有效字符个数取决于使用的字符集MEDIUMTEXT中文本类型最大长度为 16,777,215 (2^24-1)个字节有效字符个数取决于使用的字符集LONGTEXT大文本类型最大长度为 4,294,967,295 即 4GB (2^32-1)个字节有效字符个数取决于使用的字符集BINARY[(M)]固定长度二进制字节于CHAR类似但存储的是二进制字节而不是字符串。 M 表示长度以字节为单位取值范围 0 255 M 省略则长度为 1VARBINARY(M)可变长度二进制字节于VARCHAR类似但存储的是二进制字节而不是字符串。 M 表示长度以字节为单位TINYBLOB小二二进制字节类型最大长度为 255 (2^8-1)个字节BLOB[(M)]二进制字节类型最大长度为 65535 (2^16-1)个字节MEDIUMBLOB中二进制字节类型最大长度为 16,777,215 (2^24-1)个字节LONGBLOB大二进制字节类型最大长度为 4,294,967,295 即 4GB (2^8-1)个字节ENUM(value1,value2,...)• 枚举• 从值列表 value1,value2 或 (空字符串) 和 NULL 中选一个值• 最多可以有 65,535 个不同的元素• 单个元素的最大长度是 M 255 或 (M x w) 1020其中 M 是元素字符长度w 是字符集中字符所需的最大字节数• ENUM的值在内部表示为整数SET(value1,value2,...)• 集合• 从值列表 value1,value2 中选零个或多个值• 最多64个元素• 单个元素的最大长度是 M 255 或 (M x w) 1020其中 M 是元素字符长度w 是字符集中字符所需的最大字节数• SET值在内部表示为整数效果演示CHAR、VARCHAR、TEXT、ENUM和SET。CREATE TABLE string_demo ( id INT AUTO_INCREMENT PRIMARY KEY, -- 固定长度适合定长数据如性别、国家代码 country_code CHAR(2), -- 可变长度最常用适合用户名、标题等 username VARCHAR(30), -- 大文本适合文章内容、评论 article TEXT, -- 枚举单选只能在给定的列表里选一个 gender ENUM(男, 女, 保密), -- 集合多选可以在给定的列表里选多个 hobbies SET(阅读, 运动, 音乐, 旅游) );插入数据INSERT INTO 名字INSERT INTO string_demo (country_code, username, article, gender, hobbies) VALUES (CN, 张三, 这是一篇关于MySQL字符串类型的文章..., 男, 阅读,运动);演示CHAR的特性空格填充与自动删除-- 插入一个长度不足2的字符 INSERT INTO string_demo (country_code, username) VALUES (A, 李四); -- 查询长度 SELECT country_code, CHAR_LENGTH(country_code) AS 字符长度 FROM string_demo;结果分析虽然存的是A但CHAR(2)会在底层用空格填充为A 。查询时MySQL 会自动删除尾部的空格所以显示出来的长度是1。这就体现了CHAR的“定长”特性和“去尾空格”特性。2.关于排序字符串类型的列以字符为单位并且可以单独指定字符集和排序规则比如字符集是utf8mb4排序规则是utf8_0900_ai_ci二进制的列以字节为单位可以指定_bin结尾的排序规则比如排序规则是utf8mb4_bin这时以比较和排序基于数字字符代码值3.CHAR与VARCHAR的区别特性CHARVARCHAR长度性质固定长度可变长度存储方式存储时总是用空格向右填充到指定长度。按实际字符数存储不填充空格。额外开销无额外开销直接分配 M 个字符的空间。需要1 到 2 个额外字节来记录实际字符串的长度实际字节数 ≤ 255 用1字节 255 用2字节。取值处理获取列值时会自动从尾部删除空格。获取列值时不会从尾部删除空格保留插入时的空格。插入处理如果插入的值超出长度会截断严格模式下报错。如果插入的值超出长度会删除超出长度的空格若仍超长则截断或报错。取值范围0 ~ 255个字符。省略 M 默认为 1。0 ~ 65,535个字符受限于整行最大长度和字符集。特殊用法允许定义CHAR(0)值只能是NULL或空字符串主要用于旧系统兼容。无特殊 0 长度定义。适用场景适合存储长度固定或极短的数据如MD5值、性别、邮编、国家代码。适合存储长度差异较大的数据如姓名、地址、文章标题。4.VARCHAR与TEXT的区别特性VARCHARTEXT长度限制可变用户自定义0 到 65,535 字符固定上限不同 TEXT 类型上限不同TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT索引支持可以直接建立完整索引索引时必须指定前缀长度例如INDEX (col(10))不能直接对整个列建索引默认值可以设置默认值如DEFAULT 不能设置默认值存储方式通常与数据行内联存储表内通常存储在表外行内只保存一个指针排序规则支持字符集和排序规则支持字符集和排序规则但索引比较时会对尾部空格进行填充处理性能影响数据量不大时读取更快查询时会使用磁盘临时表可能带来性能开销大量数据时会显著影响内存缓冲如何选择选择VARCHAR还是TEXT主要取决于数据长度是否可预估以及查询性能要求选择 VARCHAR当你能预判数据长度上限且该字段经常会出现在WHERE、ORDER BY或GROUP BY子句中时。VARCHAR的行内存储特性和支持完整索引的优势能提供更好的查询性能。选择 TEXT用于存储文章正文、日志或评论等内容长度极不确定的大段文本。如果该字段不常被检索TEXT 能避免为长文本分配过大的行空间通过行外存储优化主表的读写效率。五⽇期类型1.类型列表类型大小说明0值• 时间戳类型TIMESTAMP[(fsp)]4 bytes• 支持范围 1970-01-01 00:00:01.000000 ~ 20388-01-19 03:14:07.499999• 0值为 0000-00-00 00:00:000000-00-00 00:00:00DATETIME[(fsp)]8 bytes• 日期类型和时间类型的组合• 支持范围 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999• 显示格式为 YYYY-MM-DD hh:mm:ss[.fraction]• 0值为 0000-00-00 00:00:000000-00-00 00:00:00DATE3 bytes• 日期类型• 支持范围 1000-01-01 ~ 9999-12-31• 显示格式为 YYYY-MM-DD• 0值为 0000-00-00TIME[(fsp)]3 bytes• 时间类型• 支持范围 -838:59:59.000000 ~ 838:59:59.000000• 显示格式为 hh:mm:ss[.fraction]• 0值为 00:00:0000:00:00YEAR[(4)]1 byte• 4位格式的年份• 支持范围 1901 ~ 2155• 显示格式为 YYYY• 0值为 00CREATE TABLE time_demo ( id INT AUTO_INCREMENT PRIMARY KEY, dt DATETIME, -- 日期时间 (8字节) ts TIMESTAMP, -- 时间戳 (4字节) d DATE, -- 日期 (3字节) t TIME, -- 时间 (3字节) y YEAR -- 年份 (1字节) ); -- 插入一条完整数据 INSERT INTO time_demo (dt, ts, d, t, y) VALUES (2024-05-20 14:30:00, 2024-05-20 14:30:00, 2024-05-20, 14:30:00, 2024); -- 再次插入一条仅指定部分字段观察自动填充效果 INSERT INTO time_demo (dt, ts) VALUES (NOW(), NOW());查看SELECT * FROM time_demo;结果示例iddttsdty12024-05-20 14:30:002024-05-20 14:30:002024-05-2014:30:00202422026-09-27 10:20:302026-09-27 10:20:30NULLNULLNULL2.其他fsp 为可选设置用来指定小数秒精度范围从0到6值为0表示没有小数部分如果省略默认精度为0CURRENT_DATE和CURRENT_DATE()是CURDATE()的同义词用于获取当前日期CURRENT_TIME和CURRENT_TIME([fsp])是CURTIME()的同义词用于获取当前时间CURRENT_TIMESTAMP和CURRENT_TIMESTAMP([fsp])是NOW()的同义词用于获取当前日期和时间以上就是我们的全部内容了
返回列表