在 MySQL 中选择合适的数据类型是设计高效、可靠数据库的关键步骤。以下是选择数据类型的基本原则和具体建议:
精准匹配数据特性
选择能准确描述数据的最小类型,避免浪费存储空间或限制数据范围。
TINYINT UNSIGNED
(0-255),而非 INT
。优先固定长度类型
定长类型(如 CHAR
)在查询和存储时效率更高,但需权衡空间占用。
CHAR(2)
(如 'CN'),变长内容用 VARCHAR
。控制存储空间
更小的数据类型减少磁盘I/O,提升缓存效率。
INT
(4字节)比 BIGINT
(8字节)更省空间,除非需要极大数值。确保扩展性和维护性
选择易于修改和维护的类型,避免过度优化导致后期成本增加。
TINYINT
而非 ENUM
,方便后续扩展。整数
TINYINT
(1字节,-128~127 或 0~255)SMALLINT
(2字节)、MEDIUMINT
(3字节)、INT
(4字节)、BIGINT
(8字节)UNSIGNED
(如 INT UNSIGNED
)。小数
DECIMAL(M, D)
,M
是总位数,D
是小数位。FLOAT
(4字节)或 DOUBLE
(8字节)。短文本
CHAR(n)
(最大255字符,适合邮编、MD5哈希等固定长度)。VARCHAR(n)
(最大65535字节,需预留字符集空间,如 utf8mb4
每个字符最多4字节)。长文本
TEXT
(最大64KB)、MEDIUMTEXT
(16MB)、LONGTEXT
(4GB)。二进制数据
BLOB
(如图片、PDF)。日期
DATE
:仅日期('YYYY-MM-DD')。TIME
:时间('HH:MM:SS')。DATETIME
:日期和时间('YYYY-MM-DD HH:MM:SS',无时区)。TIMESTAMP
:时间戳(4字节,范围1970-2038,自动转换时区)。选择建议
TIMESTAMP
。DATE
或 DATETIME
。ENUM
存储预定义值(如性别 'M', 'F'),内部用整数表示,节省空间。
SET
存储多个值的组合(如用户权限 'read,write'),用位掩码实现。
索引效率
INT
)比长字段(如 VARCHAR(255)
)索引更快。TEXT/BLOB
建全文索引,除非必要。字符集与校对规则
utf8mb4
支持所有Unicode字符(如表情符号)。utf8mb4_general_ci
)影响字符串比较和排序。NULL 与 NOT NULL
NOT NULL
:NULL
占用额外空间且增加查询复杂度。NULL
时,需处理三值逻辑(TRUE/FALSE/UNKNOWN)。存储引擎影响
用户表
VARCHAR(50)
VARCHAR(100)
(需唯一约束)CHAR(60)
(Bcrypt结果固定60字符)TIMESTAMP
(自动记录时区)商品表
DECIMAL(10,2)
(精确到分)SMALLINT UNSIGNED
(0~65535)TEXT
(允许长文本)日志表
INT UNSIGNED
(用 INET_ATON()
存储)DATETIME
(无需时区转换)EXPLAIN
分析查询性能,SHOW TABLE STATUS
查看表存储信息。正确选择数据类型能显著提升数据库性能、减少存储成本,并为后续维护奠定良好基础。