建表原则:使用可以正确存储数据的最小数据类型。为每一列选择合适的字段类型:
1.数值类型
1.1 整型
整数类型 | 占用字节 | 范围 |
---|---|---|
TINYINT | 1 | 有符号:[-128,127] 或无符号:[0,255] |
SMALLINT | 2 | 有符号:[-32768,32767]或无符号:[0,65535] |
MEDIUMINT | 3 | 有符号:[-8333608,8388607]或无符号:[0,1677215] |
INT、INTEGER | 4 | 有符号:[-21亿多,21亿多]或无符号:[0,42亿多] |
BIGINT | 8 | 很大,19位数字的范围 |
INT有5种类型,不同的类型的最大存储范围是不一样的。性别?用TINYINT,因为ENUM也是整型存储。
1)所有整数类型都有一个可选的属性UNSIGNED(无符号),此时上限取值是原来的2倍
2)还有一个属性是AUTO_INCREMENT(自增),该属性只能用于整数类型
1.2 浮点型
属性 | 存储空间 | 精度 | 精确性 | 说明 |
---|---|---|---|---|
FLOAT(M, D) | 4 bytes | 单精度 | 非精确 | 单精度浮点型,m总个数,d小数位 |
DOUBLE(M, D) | 8 bytes | 双精度 | 比Float精度高 | 双精度浮点型,m总个数,d小数位 |
注意, FLOAT 容易造成精度丢失
1.3 定点数 DECIMAL
1)高精度的数据类型,常用来存储交易相关的数据
2)DECIMAL(M,N)
- M 代表总精度
- N 代表小数点右侧的位数(标度)
- -1 < M < 254, 0 < N < 60
3)存储空间变长
2.字符串类型
类型 | 单位 | 最大 | 特性 |
---|---|---|---|
CHAR | 字符 | 最大为255字符 | 存储定长,容易造成空间的浪费 |
VARCHAR | 字符 | 可以超过255个字符 | 存储变长,节省存储空间 |
TEXT | 字节 | 总大小为65535字节,约为64KB | - |
1)MySQL默认为 utf-8,那么在英文模式下1个字符=1个字节,在中文模式下1个字符=3个字节。
2)TEXT 在 MySQL 内部大多存储格式为溢出页,效率不如 CHAR
3)字符类型变长情况下,VARCHAR 更节省空间,但是对于 VARCHAR 字段,需要一个字节来记录长度。所以,固定长度的用 CHAR ,不要用 VARCHAR 。
3.时间类型
类型 | 字节 | 表示形式 | 例 |
---|---|---|---|
DATE | 3字节 | yyyy-mm-dd | 2011-11-11 |
TIME | 3字节 | hh:mm:ss | 11:11:00 |
DATETIME | 8字节 | yyyy-mm-dd hh:mm:ss | 2011-11-11 11:11:00 |
TIMESTAMP | 4字节 | yyyy-mm-dd hh:mm:ss | 2011-11-11 11:11:00 |
timestamp 翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些时间的计算,如果是以 datetime 的形式会比较困难,假如我是 2011-11-11 11:11:00 出生,现在的时间是 2020-01-01 10:04:50,那么要计算我活了多少秒钟用 datetime 还需要函数进行转换,但是 timestamp 直接相减就行。
1)MySQL 在 5.6.4 版本之后,TIMESTAMP 和 DATETIME 支持到微秒
2)存储范围的区别
- TIMESTAMP 存储范围:1970-01-01 00::00:01 to 2038-01-19 03:14:07
- DATETIME 的存储范围:1000-01-01 00:00:00 to 9999-12-31 23:59:59
3)TIMESTAMP 和 DATETIME 可以接受的入参形式
// 下面都是 MySQL 允许的形式,MySQL 会自动处理
2011-11-11 20:48:59
2011#11#11 20/48/59
20111111204859
4)如果存进去的是 NULL,TIMESTAMP 会自动储存当前时间,而 DATETIME 会储存 NULL
5)TIMESTAMP 会根据系统时区进行转换,DATETIME 则不会,所以,一般使用 TIMESTAMP 国际化
6)注意,如存时间戳使用数字类型 BIGINT
注意,非空字段尽量定义成 NOT NULL,提供默认值,或者使用特殊值、空串代替null。NULL类型的存储、优化、使用都会存在问题。