varchar(n),n表示什么?
MySQL5.0.3之前varchar(n)这里的n表示字节数
MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个
参考:https://blog.csdn.net/zgdwxp/article/details/90675967
CHAR和VARCHAR
CHAR(4),最多存储4个字符,不足4个尾部用空格填满。存储字节数 = 数据值的字节和 + 补位空格数
VARCHAR(4),最多存储4个字符,有几个字符存储几个。存储字节数 = 数据值的字节和 + 1字节(长度标识)
整数类型
整数是定长类型,长度为字节数
常见的INT(4)只是设置了显示宽度,不影响存储长度。
即不管TINYINT(1) TINYINT(2) TINYINT(3)TINYINT(4)
可以插入表的都是-128-127的正整数
tinyint(1) 和 tinyint(4) 中的1和4并不表示存储长度,只有字段指定zerofill是有用,
如tinyint(4),如果实际值是2,如果列指定了zerofill,查询结果就是0002,左边用0来填充。
注解:也就是说只有要求编码等特殊格式字段采用zerofill
注解:有可能存储大于最大值时候不报错,但是一定是报警告
-无符号的(unsigned)
-有符号的(signed)
类型 | 容量(Bytes) | 最小(signed) | 最大(signed) | unsigned范围 |
---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 0~255 |
SMALLINT | 2 | -32768 | 32767 | 0~65,535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0~16777215 |
INT | 4 | -2147483648 | -2147483648 | 0~4294967295 |
BIGINT | 8 | -263 =9223372036854775808 | 263-1 =9223372036854775807 | 0~18446744073709551615 |
日期与时间
描述 | 显示格式 | 取值范围 | |
---|---|---|---|
YEAR | 年 | YYYY | 0000、1901~2155 |
DATE | 有日期、没有时间 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
TIME | 时分秒 | hh:mm:ss | -838:59:59 ~ 838:59:597 |
DATETIME | 包含日期和时间 | YYYY-MM-DD hh:mm:ss | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TIMESTAMP | 包含日期和时间 | YYYY-MM-DD hh:mm:ss | 1970-01-01T00:00:01Z ~ 2038-01-19T03:14:07Z |
时间类型小结
日常使用中,时间类型的选择是一个比较头疼的问题,有提倡DATETIME或TIMESTAMP,有受TIMESTAMP启发、建议直接存储INT或BIGINT的。
我们从下面几个维度比较:
取值范围:DATETIME > TIMESTAMP = INT
时间精度:DATETIME = TIMESTAMP > INT
存储开销(同等精度):DATETIME > TIMESTAMP = INT
可自动更新:DATETIME和TIMESTAMP支持ON UPDATE,INT不支持
查询性能:因为底层都是转换为整数存储,不考虑存储空间优化,几种类型性能几乎相同。
如果不考虑存储、对细微的性能感受不大、对时间范围要求较高,建议选择DATETIME;
如果考虑存储、且对时间范围要求不高,建议选择TIMESTAMP。
INT的代码处理成本较高,不建议;BIGINT虽然可以解决UNIX 2038问题,但代码处理成本高,而且相信MySQL未来会提供标准解决方案