【MySQL】数据类型

一. 数据类型的分类

分类数据类型说明
数值类型BIT(M)位类型, M指定位数, 默认值为1, 范围[1, 64]
BOOL布尔类型, 0 表示假, 1表示真
TINYINT [UNSIGNED]整型, 1 字节, 有符号范围 [-128, 127], 无符号范围 [0, 255], 默认为有符号
SMALLINT [UNSIGNED]整型, 2 字节, 有符号范围 [-2^15, 2^15-1], 无符号范围 [0, 2^16-1], 默认为有符号
MEDIUMINT [UNSIGNED]整型, 3 字节, 有符号范围 [-2^23, 2^23-1], 无符号范围 [0, 2^24-1], 默认为有符号
INT [UNSIGNED]整型, 4 字节, 有符号范围 [-2^31, 2^31-1], 无符号范围 [0, 2^32-1], 默认为有符号
BIGINT [UNSIGNED]整型, 8 字节, 有符号范围 [-2^63, 2^63-1], 无符号范围 [0, 2^64-1], 默认为有符号
FLOAT[(M,D)] [UNSIGNED]浮点数类型, 4 字节, M 指定显示长度, D 指定小数位数
DOUBLE[(M,D)] [UNSIGNED]浮点数类型, 8 字节, M 指定显示长度, D 指定小数位数
DECIMAL[(M,D)] [UNSIGNED]M 指定显示长度, D 指定小数位数, 大写和范围依赖于 M 和 D 的值
字符, 二进制类型CHAR(L)固定长度字符串, L 指定字符串长度, 使用空格填充字符串, 最大长度为 255
VARCHAR(L)可变长度字符串, L 指定字符串长度, 不填充字符串, 最大长度为 65535
BLOB存储二进制数据
TEXT存储大文本数据, 不支持全文索引, 默认值
时间日期DATE日期类型, 格式为 YYYY-MM-DD
DATETIME日期和时间混合, 格式为 YYYY-MM-DD hh:mm:ss
TIMESTAMP时间戳, 日期和时间混合, 格式为 YYYY-MM-DD hh:mm:ss
枚举与集合类型ENUM枚举类型, 用于存储单一值, 可以选择一个预定义的集合
SET集合类型, 用于存储多个值, 可以选择多个预定义的集合

二. 数值类型

1. INT

MySQL 中的 int 和 C/C++ 中的相同, 占 4 字节, 支持创建无符号类型;

create table t1 (
整型 int,
无符号整型 int unsigned
);

在这里插入图片描述

可以向表中插入合法的数据;

在这里插入图片描述

但若插入越界的数据, 将会插入失败;

在这里插入图片描述

这是因为 MySQL 对于数据范围具有严格的约束, 会直接拦截非法数据的插入, 保证数据插入的合法性;

而 int 的衍生类型(TINYINT, SMALLINT, …) 除了大小, 其他都和 int 的相同, 都适用于不同场景中;

2. BIT

bit(m), 位字段类型, m 表示比特位的长度, 范围 1~64;

在这里插入图片描述

可以向其插入合法的数据, 查询时是以十六进制的形式显示的;

在这里插入图片描述
需要注意的是, 位字段类型 (m) 限制的是比特位的长度, 而非位数, 所以向 b1 插入 2 将会失败, 2 的二进制为 0010, 超出了范围;

在这里插入图片描述

3. FLOAT

MySQL 中同样支持浮点数类型 float 和 double;

在这里插入图片描述

其中, float(4, 2) 中的 (4, 2) 表示当前浮点数支持显示 4 位, 且小数精度为 2 位, 数据范围则为 [-99.99, 99.99];

但 MySQL 在保存值时会进行四舍五入, 实际可插入 float(4,2) 的范围为 (-99.995, 99.995);

在这里插入图片描述

当 float(4, 2) unsigned 定义为无符号浮点数时, 由于浮点数的存储规则, 数据范围只保留非负部分 [0, 99.99];

在这里插入图片描述

float 存在精度损失, 当插入的小数部分过长时, 会导致精度丢失;

在这里插入图片描述

float 至多保证 7 位小数精度的准确, 而 double 除了大小, 其他都和 int 的相同, 也存在精度丢失问题, 若期望超高的精度, 应使用 decimal 类型;

4. DECIMAL

decimal 的使用方法和 float/double 相同, 但 decimal 可以保证小数部分的精度;

decimal 与 float 的对比
在这里插入图片描述

三. 字符类型

1. CHAR

在 MySQL 中, char 类型是一个固定长度的字符串;

在这里插入图片描述

其中, char(2) 的 (2) 表示字符串的长度, 并不是字符串的大小, 所以可以插入任意字符;

2. VARCHAR

varchar 是可变长度字符串;

在这里插入图片描述

varchar(vl) 和 char(cl) 不同的是, vl 是 varchar 字符串长度的上限, varchar 会根据实际插入的长度, 动态申请字符空间; 而 char 固定 cl 长度字符空间, 若实际插入长度小于 cl 长度, 会使用空格填充;

而 varchar 的实际长度和表的编码相关;
varchar 的长度支持至 65535, 但实际需要 1~3 字节用于记录数据大小, 所以有效英文字符长度为 65532;

若使用的 utf8 编码, 一个字符为 3 字节, 那么 varchar 实际支持的插入长度为 65532 / 3 = 21844 中文字符;

2. CAHR 与 VARCHAR

实际存储数据char(4)varchar(4)char 占用字符varchar 占用字符
abcdabcdabcd4*3=124*3+1=13
4*3=121*3+1=4
abcde数据超过长度 数据超过长度

若数据插入长度相同, 选择 char, 比较浪费磁盘空间, 但效率高;
若数据插入长度不定, 选择 varcha, 比较节省磁盘空间, 但效率低;

三. 时间和日期

1. DATA 和 DATETIME

MySQL 中, DATA 和 DATETIME 可以保存时间和日期;

在这里插入图片描述

2. TIMESTAMP

timestamp 表示时间戳, 是一个非空字段, 并且不允许用户插入数据;

alter table t9 add (时间戳 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

在这里插入图片描述

使用更新语句更新字段信息, 会触发时间戳的更新;

UPDATE table_name SET column_name=CURRENT_TIMESTAMP WHERE id='tar';

在这里插入图片描述

四. 枚举与集合

1. ENUM

enum, 枚举类型; 在定义 enum 字段时, 需提供若干个选项, 在设置时, 只允许选取其中的一个;

在这里插入图片描述

也可以通过下标进行选择, 下标是从 1 开始的;

在这里插入图片描述

2. SET

set, 集合; 在定义 set 字段时, 需提供若干个选项, 在设置时, 可以选取其中的一个或多个值。

在这里插入图片描述

set 也可以通过数字多选元素, 不过是使用位图表示的;
当值为 1 时, 二进制表示为 0001, 即集合中的第一个;
当值为 2 时, 二进制表示为 0010, 即集合中的第二个;
当值为 3 时, 二进制表示为 0011, 即集合中的第一, 二, 两个元素;

在这里插入图片描述

若在 set 中查询元素, 可以使用 find_in_set(val, set) 元素, 若查询成功, 返回其下标, 若失败, 返回 0; 可以和 select 配合使用;

在这里插入图片描述

若希望查询包含多个元素的行信息, 可以使用 and 级联两个条件;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值