病人基本信息字段类型应为:patient_id用bigint unsigned auto_increment,name用varchar(50) collate utf8mb4_unicode_ci,id_card和phone均用varchar,检验报告用mediumtext并独立建表,时间字段统一用datetime,敏感字段须用mysql原生aes加解密存入varbinary。
病人基本信息该用什么字段类型存
医院系统里 patient_id 必须是主键,推荐用 BIGINT UNSIGNED AUTO_INCREMENT,别用 INT——三甲医院十年积累的病人轻松超千万,INT 最大值 2147483647,撞上限后插入直接失败,错误信息是 ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'。
name 用 VARCHAR(50) 足够(含少数民族姓名、港澳台繁体),但必须加 COLLATE utf8mb4_unicode_ci,否则“喆”“煊”等字入库变问号;id_card 别用 INT 或 BIGINT 存身份证号——会丢前导零、自动转科学计数法,必须定义为 VARCHAR(18);phone 同理用 VARCHAR(15),预留国际区号和分机位。
如何存检验报告这类变长文本
检验单、病理描述、医生手写电子病历这些内容长度不可控,不能硬塞进 VARCHAR(1000)。超过 65535 字节就超出 TEXT 上限,得用 MEDIUMTEXT(最大 16MB)。
实际建表时注意两点:
- 别把报告原文和结构化字段(如
report_date、lab_code)混在一张表里,应拆成patient_reports独立表,用patient_id外键关联 -
MEDIUMTEXT字段不参与索引,如果常按“报告中是否含‘肿瘤’二字”查询,得额外加FULLTEXT索引,且查询必须用MATCH ... AGAINST,不能用LIKE '%肿瘤%'——后者会全表扫描,万级报告时响应超 5 秒
时间字段为什么必须用 DATETIME 而不是 TIMESTAMP
医院排班、手术记录、用药时间都要求精确到秒,且需跨时区保留原始录入时间(比如国际医疗队在非洲录入的记录,回国内不能自动转成北京时间)。