用于存储血型的MySQL数据类型是什么?

3

在存储血型时,哪种MySQL数据类型更可取(需要最少的数据量)?换句话说,存储一个到两个字母和“+”或“-”符号。

谢谢。


无论你对什么感到满意 - Drew
1
我的第一反应是使用ENUM,其中包含可能的值(A+、A-、B+、B-、AB+等)。但是使用ENUM也有一些注意事项。另外,由于这只是一个很小的数据量,VARCHAR(3) 也可以正常工作。 - Brandon Anzaldi
我投票使用ENUM_来解决这个问题。 - Rick James
1个回答

3

这高度取决于您的需求和想法。个人而言,我可能会为每种类型分配一个数字值,并使用tinyint。然而,如果您希望行更直接可读,则CHAR(3)VARCHAR(3)可能更合适。实际上,在这些罕见的情况下,我甚至建议使用ENUM(因为您几乎不太可能需要添加或删除可能的值)。


2
我建议在大多数情况下不要使用枚举(enum);根据我的经验,需要扩展有效值列表的情况实际上相当罕见,而在多年数据上执行alter table操作可能会很痛苦。此外,各种数据库访问库对枚举类型的支持可能有些欠缺。 - Uueerdo
2
@Uueerdo -- 那个警告已经过时了。 几个版本之前,ALTERing一个ENUM变得非常高效--_如果_你只在最后添加新值。 - Rick James
1
鉴于现代硬盘甚至是后来的固态硬盘的尺寸和成本,这几乎不是一个问题。它只有3个字符,其中2个保证会被使用。这留下第三个字符(假设数据分布与自然相对应),仅会在4%的时间内使用;但varchar也将使用一个字节来指定长度。当进行数学计算时,varchar每行可以节省2.84个字节;或者在大约360000行之后每MB成本增加。枚举将节省更多空间,但其相对古怪的行为以及数据库API中支持不完善的问题需要解决,因此并不值得使用。 - Uueerdo
1
如果空间(或速度)是如此重要的问题,则tinyint将是最佳选择。它甚至可以从表示A [yes | no] | B [yes | no] | positive [yes | no]的3位值进行编码,其中0为O negative。 - Uueerdo
1
CHAR(3)在utf8中会占用更多的空间--始终为9个字节;而VARCHAR(3)则不会,无论CHARACTER SET如何(假设血型只使用英文字符),它都只会占用3-4个字节。 - Rick James
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接