数据类型的选择
数据库数据类型的选择需要平衡,存储空间和执行效率
- char类型
长度在一个固定区间,执行速度快,存储值小于固定长度会造成空间浪费
//编码字节表
1.ASCIIS码
1个英文字母(不分大小写)= 1个字节的空间
1个中文汉字 = 2个字节的空间
1个ASCII码 = 1个字节
2.UTF-8编码
1个英文字符 = 1个字节
英文标点 = 1个字节
1个中文(含繁体) = 3个字节**常用***
中文标点 = 3个字节
3.Unicode编码
1个英文字符 = 2个字节
英文标点 = 2个字节
1个中文(含繁体) = 2个字节
中文标点 = 2个字节
- varchar类型
存储值和值的长度,适用于长度变化明显,执行效率较低
4.0版本以下,varchar(20),指的是20字节,
如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,
无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节
Mysql5根据编码不同,存储大小也不同,具体有以下规则:
1. 存储限制
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
2.编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
- int类型
所有的数据类型中时空复杂度最好,可以进行算数运算或排序,能用尽量用
int2 是2字节 有符号整型,额定16位,符号占1位,余下15位2进制位表示数值 。
int4 是4字节 有符号整型,额定32位, 符号占1位,余下31位2进制位表示数值 。
int8 是8字节 有符号整型,额定64位,符号占1位,余下63位2进制位表示数值 。
-
float类型/double类型
对精度要求不高,优先使用float其次是使用double来进存储。 -
decimal类型
如果对精度要求比较高,效率低。、 -
date类型
时间存储精确到天 -
datetime类型
时间存储精确到秒 -
varchar(10)和char(10)的差别是什么?存储超过时候会发生什么问题呢?这个问题其实也相对经典,我也是整了很久才搞清楚的。在MYSQL5,5以后,varchar(x)x中范其实是存储字段的长度范围,就是一个字符代表一个长度,不管这个字符是汉子还是字符都算是一个长度单位。varchar虽然设置长度值,可是因为varchar是可变的长度类型,也就是当存储的长度小于x时候,其实实际的存储空间不是x而是实际存储的字符长度+一些标示空间。当然如果超过x的长度的话还是会报错的。而char(y)中y的值就是存储空间实际的存储长度,超过这个长度的话就会报错。
编码字节表
- ASCIIS码
- 1个英文字母(不分大小写)= 1个字节的空间
- 1个中文汉字 = 2个字节的空间
- 1个ASCII码 = 1个字节
- UTF-8编码
- 1个英文字符 = 1个字节
- 英文标点 = 1个字节
- 1个中文(含繁体) = 3个字节
- 中文标点 = 3个字节
- Unicode编码
- 1个英文字符 = 2个字节
- 英文标点 = 2个字节
- 1个中文(含繁体) = 2个字节
- 中文标点 = 2个字节