一 前言
每个数据库的数据类型从来都不是一个简单的数据结构,特别是使用不同的数据库,不同的引擎,其支持的数据类型也不一样,选择那种数据类型作为字段类型对数据库的性能也是天差地别,故对数据类型有个全面的认知,在数据库表设计的时候选择合适的数据类型就尤其重要;本篇是基于mysql的InnoDB的数据类型知识,要学就学主流知识;
学习本篇的基础是知识追寻者发过的SQL系列文章(公众号读者直接在专栏里面找即可)
《SQL-你真的了解什么SQL么?》
《SQL-小白最佳入门sql查询一》
《SQL-小白最佳入门sql查询二》
《SQL- 多年开发人员都不懂的插入与更新删除操作注意点》
《SQL-SQL事物操作》
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
”
二 基础数据类型
2.1 字符串类型
char(n)
类型 , 定长字符串,即储存的每个值占用的空间都一样;适用于储存长度都一样的字段,比如 电话号码,身份证号,密码等;mysql 在 储存char类型字段时,会自动删除末尾保留的空格;如果是SQL SERVER 其后面就会保留空白字符;其最多储存 0 - 255 个字符,即8位;varchar(n)
类型, 变长字符串, 比如varchar(n)表示可以储存n个字节;当字符串长度小于等于255个字节时,其会使用 n 个字节储存数据,额外一个字节记录n值,比如varchar(200), 其实际为 varchar(201);如果字符串长度大于255个字节,其会用2个字节记录n值,比如 varchar(500) , 其实际为varchar(502);其最多储存 0-65535 字节,即64位;由于其是可变长度,故在更新的时候,性能开销比较大;TEXT
长文本类型,存储大数据,其有一定的字符集和排序规则,故如果设置位text类型,性能会降低很多,占用的磁盘空间较大;其长度为0-65535 字节;其衍生的数据类型还有TINYTEXT
(0-255字节),MEDIUMTEXT
(0-16 777 215 字节),LONGTEXT
0-4 294 967 295字节);blog
类型 , 储存没有规则的二进制字符串,其存储 (0-65 535) 个字节;其衍生的类型有TINYBLOB
(0-255字节),MEDIUMBLOB
(0-16 777 215 字节),LONGBLOB
(0-4 294 967 295字节);
实际开发中 一般会选择 char , varchar 类型进行储存数据,text少用,blog慎用,坑比较大;并且指定不同的数据类型长度也直接影响到数据库的性能,每次跟磁盘进行一次I/O的能力也不一样;
2.2 整型
- tinyint 1字节 8 位
- smallint 2字节 16位
- mediumint 3字节 24 位
- int 4字节 32位
- bigint 8字节 64 位
其储存大小为 -2^(N-1)至 2^(N-1)-1 ,其中 N 为位数, 如果是无符号整型,则从0开似乎,没有负数,但其实际储存情况和有符号整型性能差不多,在实际开发中应该根据不同的业务需求,选择合适的类型;
常用tinyint(1)表示布尔型,1 为真,0为假;
2.3 浮点型
- float(单精度) 4字节
- double(双精度) 8字节
- decimal, 其能指定储存精度,decimal(M,D) , 其中M代表总位数,D代表小数位,M-D 代表整数位;比如金钱相关的计算就推荐使用decimal , 否则造成精度丢失问题,去面试的时候如果问道使用浮点型就回家等通知吧!
2.4 日期时间类型
- date , 日期 通常就是 YYYY-MM-DD 格式, 当然也可以格式化为其它格式,所有的格式化形式都不在本篇讨论范围内;
- time, 时间 格式 hh:mm:ss ;
- year 年份 YYYY;不建议使用YY
- datetime , 日期时间格式 , 其日期范围 为 1001 至 9999 年,精度为秒;占用8位;
- timestamp, 挺多人称其为时间戳,其实其是与Unix时间戳相同而已,从 1970 1 月 1日 午夜来表示秒数,最多储存至2038 年。其依赖于时区,占用4位;
在日常开发中推荐使用 timestamp 进行储存时间,性能相比于datetime 较好;它们的标准格式都为 YY-MM-DD hh:mm:ss;
2.5 枚举与SET类型
- enum(val1, val2, val3...), 用于储存固定值,比如性别男女, 四级 春夏秋冬;其内部使用整型排序,显示时使用字符串,故在排序的时候可能会发生一些奇怪的现象,可以用
field
进行指定排序; 储存大小为16位;
示例
create table test_enum ( `gender` enum('男', '女') );
INSERT INTO `zszxz`.`test_enum`(`gender`) VALUES ('男');
- set(val1, val2, val3...), 集合, 类似于数组,相比于枚举只能存储单个值,其能储存多个值;储存大小为64位;
示例
create table test_set ( `gender` set('男', '女') );
INSERT INTO `zszxz`.`test_set`(`gender`) VALUES ('男,女');
2.6 其它
其它数据类型比如 ,bit , 储存位, 坑也很大;不建议使用;在众多数据类型中优先选择整型,其性能相比于字符串的排序规则等会快很多;字段的修饰符 通常有 NULL , NOT NULL , CONMENT 等, 如果是非空字段尽量默认为NOT NULL , 其能带来一定性能提升,并且在使用索引的时候相对简单;尽量不要使用外键,每次外键都会带来额外的性能开销;