字段长度概念
表字段的长度我们要区分字节长度和字符长度。
通常我们在设计表的列长度时,需要指定长度,这里的长度我们把它理解为字符长度,比如说vachar(10)、char(10)这种,这里代表当前字段的值字符最大长度为10,也就是10个字符。
另外,对于数据类型对应的字节长度也是我们需要去理解的,什么叫字节长度,这里说的是每一种数据类型都有它对应的存储字节数。下面我们来详细说说他们的区别
一.字符长度
我们在设计表的时候会给列指定长度,如int(m)、char(m)、vachar(m)等等,如下代码所示
CREATE TABLE `t_work` (
`id` int NOT NULL AUTO_INCREMENT,
`workId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`workStatus` int(2) unsigned zerofill DEFAULT NULL,
`week` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`operatorId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`operator` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `operatorId` (`operatorId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
int(2),tinyint(2),bigint(20),这里的m值其实代表最小显示位数,基本上没有什么太大意义,除非你指定zerofill ,也就是填充0,如上数字段workStatus,如果你插入的值小于2,如workStatus插入的值为1,此时查询出来的来workStatus值为01。
char(10),vachar(10)这里的m值代表的是当前字段插入字符的最大数量为10。
二.字节长度
所谓字节长度指的是字段所选的数据类型所占用的内存字节数。如int类型的数据占有四个字节的大小,这就代表了会有取值范围,下面我们来看看各个类型所在的取值范围
Int类型:4字节,带符号:-2147483648到2147483647,不带符号:0到4294967295;
Float类型:4字节,最小非零值:±1.175494351E-38,最大非零值:±3.402823466E+38;
Double类型:8字节,最小非零值:±2.2250738585072014E-38,最大非零值:±1.7976931348623157E+38;
Date类型:1000-01-01~9999-12-31,3字节(MySQL3.23版以前是4字节 ) 0000-00-00
Time类型:-838:59:59~838:59:59,3字节,00:00:00
DateTime类型:1000-01-01 00:00:00~9999-12-31 23:59:59,8字节,0000-00-00 00:00:00;
TimeStamp类型:19700101000000~2037年的某个时刻,4字节,00000000000000;
Year类型:Year(4),1901至2155。Year(2),1970~2069,1字节,0000;
Char类型:非空Char的最大总长度是255字节,可空CHAR的最大总长度是254字节
Vachar类型:非空Vachar的最大总长度是65533字节,可空VARCHAR的最大总长度是65532字节
原因:非空标记需要占据一个字节,Vachar超过255需要用2个字节标记字段长度,不超过255用1个字节标记字段长度
另外,需要注意的是汉字字符的字节长度与编码格式有关系,UTF-8编码的一个汉字占三个字节,GBK编码占两个字节