目录

MySQL 8.0 字符存储机制和字段长度设计规范参考

🧩 一、基础配置建议

项目推荐设置说明
字符集utf8mb4支持中日韩文字及 emoji
排序规则utf8mb4_general_ci性能与兼容性均衡
存储引擎InnoDB默认事务型引擎
时间精度DATETIME(3) / TIMESTAMP(3)毫秒精度时间戳
主键类型BIGINT UNSIGNED AUTO_INCREMENT高并发安全、自增ID
默认命名规范全小写+下划线例:user_infocreated_at

🧱 二、通用字段模板(推荐统一使用)

字段名类型默认值说明
idBIGINT UNSIGNED AUTO_INCREMENT-主键,自增
created_atDATETIME(3)CURRENT_TIMESTAMP(3)创建时间
updated_atDATETIME(3)CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)更新时间
deleted_atDATETIME(3)NULL删除时间(逻辑删除)
created_byBIGINT UNSIGNEDNULL创建人ID
updated_byBIGINT UNSIGNEDNULL更新人ID
deleted_byBIGINT UNSIGNEDNULL删除人ID
remarkVARCHAR(255)NULL备注信息

🧠 三、常见字段类型与长度选型

场景字段名类型推荐长度说明
主键idBIGINT UNSIGNED-自增主键
名称类name / titleVARCHAR(60)60一般名称、标题、标识
描述类description / remarkVARCHAR(255) / TEXT255 / 长文本可写说明内容
邮箱emailVARCHAR(100)100常见邮箱最大约 70
电话phoneCHAR(11)11固定长度手机号
用户名usernameVARCHAR(50)50英文或拼音用户名
密码passwordCHAR(60)60bcrypt 哈希值长度
性别genderENUM(‘male’,‘female’,‘unknown’)-性别枚举
状态statusENUM(’enabled’,‘disabled’,‘pending’,’error’)-业务状态
IP 地址ip / cluster_ip / external_ipVARCHAR(45)45兼容 IPv4 / IPv6
URL / 链接urlVARCHAR(2083)2083浏览器最大 URL 长度
UUIDuuidCHAR(36)3636位 UUID 格式
金额amount / priceDECIMAL(10,2)-最大 99999999.99
数量count / totalINT UNSIGNED-整数统计值
布尔状态is_active / enabledTINYINT(1)-0 / 1 表示真假
JSON 配置config / metaJSON-存储动态数据结构
时间戳create_time / update_timeDATETIME(3)-带毫秒时间字段
地区代码country_codeCHAR(2)-ISO 3166-1,例如 CN
版本号versionVARCHAR(20)20软件或接口版本号
语言languageVARCHAR(10)10例如 zh-CN、en-US

🧮 四、设计规范建议

1️⃣ 字符类型选择

内容建议类型
可变长度字符串VARCHAR(n)
固定长度字符串(手机号、UUID)CHAR(n)
超长文本TEXT
动态结构化数据JSON

2️⃣ 数字类型选择

场景类型说明
主键、自增 IDBIGINT UNSIGNED0~2^64
普通整数INT常规计数
小整数SMALLINT0~65535
状态码、标志位TINYINT0~255
金额、比率DECIMAL(10,2)精确存储,不丢失小数

3️⃣ 时间类型选择

类型推荐用途说明
DATETIME(3)通用时间字段可存 1000-9999 年
TIMESTAMP(3)记录修改时间自动受时区影响
DATE仅日期例如生日、到期日
TIME仅时间例如打卡时间

4️⃣ 约束与默认值

  • 必须定义主键;
  • 时间字段默认自动填充;
  • 所有 VARCHAR 字段必须指定长度;
  • 使用 ENUM 时务必定义默认值;
  • JSON 字段不建议建立索引;
  • 所有金额、统计类字段应定义为非负数(UNSIGNED)。

🧱 五、模板示例:标准业务表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
CREATE TABLE `user_account` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱地址',
  `phone` CHAR(11) DEFAULT NULL COMMENT '手机号',
  `password` CHAR(60) NOT NULL COMMENT '加密密码',
  `status` ENUM('enabled','disabled') DEFAULT 'enabled' COMMENT '账户状态',
  `role` ENUM('admin','user','guest') DEFAULT 'user' COMMENT '角色',
  `last_login_ip` VARCHAR(45) DEFAULT NULL COMMENT '最近登录IP',
  `last_login_time` DATETIME(3) DEFAULT NULL COMMENT '最近登录时间',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
  `created_at` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户账户信息表';

🧾 六、附录:长度选择经验法则

类型推荐长度可存内容
VARCHAR(10)10 字符 ≈ 10 汉字简短标签
VARCHAR(50)50 字符姓名、短标题
VARCHAR(100)邮箱、域名
VARCHAR(255)描述、路径、配置项
VARCHAR(512)中等长度内容
TEXT长文本、日志、配置文件
JSON动态结构数据(如端口映射)