SQL-Mysql数据类型

1,270 阅读5分钟

一 前言

每个数据库的数据类型从来都不是一个简单的数据结构,特别是使用不同的数据库,不同的引擎,其支持的数据类型也不一样,选择那种数据类型作为字段类型对数据库的性能也是天差地别,故对数据类型有个全面的认知,在数据库表设计的时候选择合适的数据类型就尤其重要;本篇是基于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 , 其能带来一定性能提升,并且在使用索引的时候相对简单;尽量不要使用外键,每次外键都会带来额外的性能开销;

关注知识追寻者:

tLeP2D.png