MySQL 数据类型

无人久伴 提交于 2020-01-19 05:56:45

MySQL 数据类型

SQL数据类型

字段类型:
数值型

  • 整数
  • 浮点数

字符类型
日期时间类型

数值型

整型

类型(有符号数/无符号数) 长度(有符号数/无符号数)
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 二进制数据(字节而非字符)

一般不会把图片内容输入数据库, 只是保存其路径

字段类型如何考虑

  • 尽量精确
  • 考虑应用语言处理
  • 考虑移植的兼容性
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!