MySQL 数据类型
字段类型:
数值型
- 整数
- 浮点数
字符类型
日期时间类型
数值型
整型
类型(有符号数/无符号数) | 长度(有符号数/无符号数) |
---|---|
tinyint | 1byte |
smallint | 2byte |
mediumint | 3byte |
int/intege | 4byte |
bigint | 8byte |
有符号数|无符号数
上面类型默认为有符号数, 可以通过unsigned
转为无符号数
create table tbl_int (
a tinyint unsigned,
b tinyint
);
定义显示宽度
通过规定数据的显示宽度, 达到统一显示的目的
格式: 类型(M) M 表示显示的最小宽度
需要使用前导零填充达到目的, 称之为 zerofill
create table tbl_int (
a tinyint unsigned,
b tinyint,
c tinyint(2) zerofill
);
不存在布尔类型, 通过整形0表示false, 非零值表示true,
浮点数
单精度(float) 4byte 默认精度位是6
双精度(double) 8byte 默认精度位16
支持, 控制数值的范围Type(M, D)
M: 所有的数值位数, 不包括小数点和正负号
D: 允许的小数的位数
举个例子:
(4,2): 范围(-99.99, 99.99)
浮点数支持科学计数法, 如 1234 = 1.234e3
定点数:
decimal 变长, 整数部分和小数部分分开保存
decimal(M, D) M总位数, D小数位数(范围存在) M默认是10, D默认为0
浮点数也支持 无符号, 并不是存储位数增加了, 只是表明只能存储非负数.
时间日期
年月日时分秒 Datetime 8字节
年月日 Date 3字节
时间 HH:MM:SS 3字节 (-838:59:59, 838:59:59)不仅可以表示时间,还可以表示时间间隔.
时间戳 timestamp (内部存储时是整型(4字节), 表示时是日期时间)
时间 HH:MM:SS 3字节
年 YYYY 1字节
create table dt_1 (
a datetime,
b timestamp
);
insert into dt_1 values("2013-04-05 11:45:45", "20130405114545");
检索列时, +0
可以检索时间表示的形式同 "20130405114545"
select a, b+0 from dt_1 where 1;
支持任意分割符日期, 不过可能导致逻辑不清晰
支持0值, 表示当前没有规定
2017-07-0 表示4月一整月.(逻辑想法)
字符串类型
char varchar
char(M) 固定长度
varchar(M) 可变长度
M: 表示允许的字符串长度; M是字符数而不是字节数.
M 在 varchar 中表示的允许最大长度, char 中 M 表示严格限定的长度.
字符串 | char(5) | varchar(5) | 说明 |
---|---|---|---|
"" | 5个字符 | 1个字节 | varchar需要一个字符节(长度不超过255)保存字符串长度 |
"abc" | 5个字符 | 1个字节 + 3字符 | |
"abcde" | 5个字符 | 1字节 + 5个字节 | |
"fdsfdf" | 插入失败 | 插入失败 |
char 效率高
varchar 省空间
注意, 字段的最大长度除了类型本身限制之外, 记录(row)的总长度也有限制.
varchar的字符, 总长度为 65535, 当数据长度超过255个字符时, 用两个字节表示长度, 65533个字节保存数据, 整个记录需要一个额外字节表示字段的null值, 最长为65532, 除非所有的字段不能为空, 这个字节可以省略(要记住有一个记录的长度限制); 不论有多少个字段存在在null, 都是使用统一的一个字节来表示, 而不是每个字段一个字节保存null;
create tbl_char1 ( varchar(65533) not null, varchar(65532) ) character set latin1;
text
- tinytext 2^8+1(最大长度)
- text 2^16+2
- mediumtext 2^24+3
- longtext 2^32 + 4
text定义时, 通常不用指定长度, 自己计算得到.
enum
枚举选项量(65535) 内部存储用整型表示, 字段值只能是某一个
create table tbl_enum (
gender enum("female", "male")
);
insert into tbl_enum values("female");
insert into tbl_enum values("male");
select gender+0 from tbl_enum; // 显示为整型
set
set 元素个数64 内部整数表示(1, 2, 4, 8, 16) (位bit)
create table tbl_set (
hobby set("cat", "dog", "panda")
);
insert into table_set values("cat, dog"); // 标识为11=3
insert into table_set values("cat, panda"); // 标识为101=5
binary
字符才有编码的概念
binary varbinary blob 二进制数据(字节而非字符)
一般不会把图片内容输入数据库, 只是保存其路径
字段类型如何考虑
- 尽量精确
- 考虑应用语言处理
- 考虑移植的兼容性
来源:https://www.cnblogs.com/nowgood/p/shu-ju-lei-xing.html