目录
一. 数据类型的分类
分类 | 数据类型 | 说明 |
---|---|---|
数值类型 | 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 占用字符 |
---|---|---|---|---|
abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
啊 | 啊 | 啊 | 4*3=12 | 1*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 级联两个条件;