MySQL建表怎么选_数据类型详解_避坑指南全解析,MySQL数据类型选择与建表避坑攻略全解析
你是不是刚学MySQL建表时,面对一堆数据类型头皮发麻?int和varchar到底用哪个?datetime和timestamp有啥区别?今天咱们就掰开揉碎了讲透这事儿,保准你看完就能上手不踩坑!
一、数据类型选型三大铁律
第一招:按需分配不浪费
- 整数类型就像行李箱:小物件别用大箱子。比如年龄字段用TINYINT足够(0-255岁),用INT就是杀鸡用牛刀
- 浮点数要精打细算:超市价格用DECIMAL(6,2),能精确到分;科学计算用DOUBLE,但别超过16位小数
- 字符串长短有别:用户名用VARCHAR(20),个人简介用TEXT,千万别用CHAR存长文本,那会浪费存储空间
第二招:时间类型门道多
- 生日记录用DATE,签到时间用DATETIME,自动更新的时间戳用TIMESTAMP。有个哥们用DATE存登录时间,结果秒数全丢了
- 特殊需求看这里:YEAR类型存年份,TIME存持续时间。上次见人用INT存年份,结果输错成20215也没报错
第三招:特殊类型妙用
- ENUM适合固定选项:性别字段用ENUM('男','女','未知'),比VARCHAR省空间还防乱输
- SET类型玩多重选择:用户兴趣标签用SET('音乐','运动','美食'),一个字段存多个值
- JSON类型是新宠:存动态结构数据超方便,比如用户个性化设置
二、建表示范六步走
步骤1:骨架搭建
sql复制CREATE TABLE user_profile (user_id INT UNSIGNED AUTO_INCREMENT,-- 后续字段...PRIMARY KEY (user_id));
这里AUTO_INCREMENT让主键自动增长,UNSIGNED防止出现负数
步骤2:填充血肉
sql复制username VARCHAR(20) NOT NULL,password CHAR(60) NOT NULL, -- 用Bcrypt加密固定60位birth_date DATE,last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
密码字段用定长CHAR,加密后长度固定;时间戳自动更新
步骤3:设置约束
sql复制email VARCHAR(320) UNIQUE,age TINYINT UNSIGNED CHECK (age >= 18),balance DECIMAL(10,2) DEFAULT 0.00
UNIQUE防重复邮箱,CHECK约束未成年注册,DEFAULT给初始值
步骤4:特殊字段处理
sql复制interests SET('编程','健身','美食'),metadata JSON
SET类型存多选兴趣,JSON存扩展信息
步骤5:引擎选择
sql复制) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
InnoDB支持事务,utf8mb4兼容emoji
步骤6:验证结构
sql复制DESC user_profile;
查看字段类型是否设置正确
三、五个常见翻车现场
案例1:手机号存成INT
11位手机号用INT存会溢出,应用VARCHAR(11)。有人存了18812345678,结果变成2147483647
案例2:金额用FLOAT
0.1+0.2=0.30000000000000004?改用DECIMAL(10,2)保平安
案例3:超长文本用VARCHAR
VARCHAR最多65535字节,超长用TEXT。见过有人用VARCHAR(100000)直接报错的
案例4:时间类型混用
TIMESTAMP到2038年就溢出,重要日期还是用DATETIME稳妥
案例5:忘记设置主键
表没主键就像没身份证,InnoDB会自己建隐藏主键,但性能差三倍
四、性能优化三板斧
招式1:精准匹配
- IP地址存INT UNSIGNED,比VARCHAR(15)省空间,用INET_ATON()转换
- 状态字段用TINYINT代替ENUM,查询更快
招式2:合理分型
- 文章内容用MEDIUMTEXT,避免LONGTEXT浪费
- 经纬度用DECIMAL(9,6),精度到米级足够
招式3:预判扩展
- 预留字段长度:VARCHAR(255)改VARCHAR(200)可能触发锁表
- 用NULL要谨慎,NOT NULL DEFAULT ''更省空间
五、个人踩坑心得
干了八年数据库开发,总结三个血泪教训:
- 不要过早优化:见过新人把每个字段都算到字节,结果需求一变全白费
- 留好变更余地:VARCHAR长度宁可稍微大点,有次把手机号字段从11改15,线上变更花了三小时
- 注释就是生命线:给每个字段写注释,三个月后自己都看不懂的代码不是好代码
记住,数据类型选择是数据库设计的基石。下次建表时,先问自己三个问题:这个字段要存什么?范围有多大?未来会怎么变?把这三点想明白,你就能避开90%的坑!