每个数据库的数据类型从来都不是一个简单的数据结构,特别是使用不同的数据库,不同的引擎,其支持的数据类型也不一样,选择那种数据类型作为字段类型对数据库的性能也是天差地别,故对数据类型有个全面的认知,在数据库表设计的时候选择合适的数据类型就尤其重要;本篇是基于mysql的InnoDB的数据类型知识,要学就学主流知识;
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^(N-1)至 2^(N-1)-1 ,其中 N 为位数, 如果是无符号整型,则从0开似乎,没有负数,但其实际储存情况和有符号整型性能差不多,在实际开发中应该根据不同的业务需求,选择合适的类型;
常用tinyint(1)表示布尔型,1 为真,0为假;
在日常开发中推荐使用 timestamp 进行储存时间,性能相比于datetime 较好;它们的标准格式都为 YY-MM-DD hh:mm:ss;
field
进行指定排序; 储存大小为16位;示例
create table test_enum ( `gender` enum('男', '女') );
INSERT INTO `zszxz`.`test_enum`(`gender`) VALUES ('男');
示例
create table test_set ( `gender` set('男', '女') );
INSERT INTO `zszxz`.`test_set`(`gender`) VALUES ('男,女');
其它数据类型比如 ,bit , 储存位, 坑也很大;不建议使用;在众多数据类型中优先选择整型,其性能相比于字符串的排序规则等会快很多;字段的修饰符 通常有 NULL , NOT NULL , CONMENT 等, 如果是非空字段尽量默认为NOT NULL , 其能带来一定性能提升,并且在使用索引的时候相对简单;尽量不要使用外键,每次外键都会带来额外的性能开销;