开发经验mysql如何选择合适的数据类型
Posted 叁滴水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发经验mysql如何选择合适的数据类型相关的知识,希望对你有一定的参考价值。
mysql支持多种数据类型,一般情况,对于开发者而言,在保证数据可以正常存储的前提现,会选择一种数据结构简单、占用空间小的类型。例如: 可以用用数值类型保存IP。此,更加详细的梳理下如何选择更加合适的数据类型。
1、整数型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值。类型字段、状字段 |
SMALLINT | 2字节 | (-32 768,32 767) | (0,65 535) | 大整数值。 |
MEDIUMINT | 3字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT | 4字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数型 |
BIGINT | 8字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 特大整数型。主键字段 |
整数类型相对简单、一般用来类型字段、主键字段、数量字段
等。数值类型是可以指定宽度int(11)对于大多数应用来说,没有意义。因为int(1)和int(11)占用的空间是一样的。
2、金额类型
float、double
可以保存带有小数的数值,但是计算时会有精度缺失的问题,导致数据库总是有奇奇怪怪的值。进行金额计算时肯定是不允许存在这种情况,因此可以使用decimal
进行高精度的运算。例如decimal(10,2)
,表示共10个数字,小数点后2个数字,小数点前8个数字。如:12345678.00
。
另外,decimal
这种数据类型需要额外的空间进行高精度计算。因此,如果对于数值计算较多的系统中,也可以使用bigint
代替。一般常见的场景是通过bigint
存储最小的单位(分)。这样在计算时避免了精度不准的问题。
3、字符串类型
众所周知,varchar
是一个可变的字符串类型。久而久之,许多开发者忽略了char类型。虽然varchar适用于大部分场景,但是一些特殊场景char
的优势会很明显。此,为char
类型进行平反。
varchar类型
varchar
的优点想必都知道,我就不在阐述,此讨论下其弊端:
- 由于是一个长度可变的类型。因此,在保存数据的时候需要1或者2个额外的字节记录字符串的长度。例如
varchar(10)
需要11
个字节进行存储。 - 如果修改数据时,使得当前行的数据变长。对于磁盘来说,如果当前页没有足够的空间存储的话,就会很麻烦。对性能上也会有影响
char类型
char类型是一种定长的类型。也就是,当设置了char(10)
的时候,不管里面存几个字节,总占用空间都是10
个字节。也正是这种不灵活的类型,被很多开发者摒弃。其优点
- 定长的类型,更加不容易产生空间碎片。
- 对于较短的列,
char
更加节省空间。char(1)
需要1个字节;varchar(1)
需要2
个字节,因为需要有一个字节记录长度。
因此,在已知存储的数值是固定长度的时候,例如存储md5的类型、手机号、身份证号时,char类型是一个很好的选择。
注意点
虽然varchar
是一个长度可变的数据类型。但是,当varchar(10)
和varchar(255)
都去保存123
的时候,效果是不一样的。有兴趣的可以看下说明。因此,还是需要选择更加合适的长度。
4、 时间类型
类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值 |
---|---|---|---|---|---|
DATETIME | 8字节 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4字节 | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某个时刻 | 00000000000000 |
DATE | 4 字节 | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 字节 | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 字节 | YYYY | 1901 | 2155 | 0000 |
时间类型选择相对简单。在此不再多说。
5、BIT类型
可以使用BIT列存储一个或者多个true/false
的值,一般可以用于是否删除
字段。如BIT(1),在数据库插入时,只能插入1/0
。其最大长度为64位。
6、枚举类型
与JAVA枚举类似,适用于在一组固定的值中选择一个的场景,常见的有男/女
,红/黄/蓝
等等。
枚举的优点:
- 即使用保存男/女,在真正存储时实际是保存的索引值,占用空间更少。
- 可以控制用户输入,减少异常。
7、SET类型
与枚举类型的使用很类似,枚举类型是只能选择一个,但是SET类型可以选择多个。常见的场景有,一个老师可以教多个班级,这种一对多的场景,有时候不想设置中间表进行关联,可以在数据库通过逗号的方式进行分割,SET类型就是一个很好的选择,可以很好的限制垃圾数据。
总结
对于JAVA而言,总结了一下java属性对应数据库字段类型的对应关系。大概如下,请大家参考。
java类 | 数据库 |
---|---|
Byte | TINYINT |
Short | SMALLINT |
Integer | INT |
Long | BIGINT |
Float | FLOAT |
Double | DOUBLE |
BigDecimal | DECIMAL |
Boolean | BIT |
String | VARCHAR |
Boolean | CHAR(1) |
java.uitl.Date/java.sql.Date | DATETIME/TIMESTAMP |
Clob | CLOB |
Blob | BLOB |
以上是关于开发经验mysql如何选择合适的数据类型的主要内容,如果未能解决你的问题,请参考以下文章