MySQL 字段类型
MySQL 字段类型
MySQL 字段类型可以简单分为三大类:
- 数值类型:
- 整型:TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT
- 浮点型:FLOAT、DOUBLE
- 定点型:DECIMAL
- 字符串类型:
- 常用:CHAR 和 VARCHAR
- TEXT类:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
- BLOB类:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB
- 日期时间类型:YEAR、TIME、DATE、DATETIME 和 TIMESTAMP 等。
整型相关问题
整型如何存储Boolean类型:
MySQL 中没有专门的布尔类型,而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。
整型如何存储IP地址:
可以将 IP 地址转换成整形数据存储,性能更好,占用空间也更小。
MySQL 提供了两个方法来处理 ip 地址
INET_ATON()
:把 ip 转为无符号整型 (4-8 位)INET_NTOA()
:把整型的 ip 转为地址
插入数据前,先用 INET_ATON()
把 ip 地址转为整型,显示数据时,使用 INET_NTOA()
把整型的 ip 地址转为地址显示即可。
整型-UNSIGNED属性
MySQL 中可以使用可选的 UNSIGNED 属性表示整数类型不允许负值。对于从 0 开始递增的 ID 列,使用 UNSIGNED 属性可以拥有更大的上限范围。
小数型相关问题
定点型-浮点型-区别
- DECIMAL 是定点数,DECIMAL 可以存储精确的小数值。例如与货币相关的数据,避免浮点数带来的精度损失。在 Java 中,MySQL 的 DECIMAL 类型对应的是 Java 类 java.math.BigDecimal。
- FLOAT/DOUBLE 是浮点数,FLOAT/DOUBLE 只能存储近似的小数值。
字符串相关问题
字符串-NULL-”-区别
字符串-char-varchar-区别
- CHAR(0-255 字节)是定长字符串,VARCHAR(0-65,535 字节) 是变长字符串
- CHAR适合存储长度较短或者长度都差不多的字符串,VARCHAR适合存储长度不确定或者差异较大的字符串
- CHAR在存储时会在结尾填充空格以达到指定的长度,检索时会丢失末尾的空格信息。VARCHAR 在存储时需要使用 1 或 2 个额外字节记录字符串的长度。
- CHAR后续修改不会造成页分裂的问题,使用varchar可能会产生内存碎片,update可能会导致页分裂问题。 CHAR(M) 和 VARCHAR(M) 的 M 都代表能够保存的字符数的最大值,无论是字母、数字、中文还是表情,每个都只占用一个字符
字符串-varchar(100)-varchar(10)-区别
VARCHAR(100)表示最多能存储 100 个字符,VARCHAR(10)则是10个。但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的,VARCHAR(100) 会消耗更多的内存。
TEXT-BLOB-不推荐使用原因
日期时间类型
日期时间-DATETIME-TIMESTAMP-区别
- DATETIME 类型没有时区信息,占用8 个字节,DATETIME:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- TIMESTAMP 和时区有关,占用4 个字节,Timestamp:1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
文件类型
MySQL字段优化
参考
- MySQL函数
- 《高性能 MySQL(第三版)》的第四章,详细介绍 MySQL 字段类型优化。