在MySQL数据库中存储性别的最佳技术

时间:2013-06-20 15:59:21

标签: mysql database sqldatatypes

哪种方法可以在MY SQL数据库中存储性别?我对这个问题感到有点困惑,因为不同的人以不同的方式表达。有人建议将其存储在 INT 中更好,但其他建议 TINYINT 枚举,但有些人建议将其存储在CHAR(1)<男性强> M 女性 F

此外,在听到http://en.wikipedia.org/wiki/ISO_5218

时会更加怀疑

但是在我看来将它存储在CHAR中是一个好主意,因为它提供了比ENUM更强大的稳健性?我也关注可扩展性,想知道存储数百万条记录的更好解决方案。

非常感谢专家提出的宝贵建议。

2 个答案:

答案 0 :(得分:9)

如果您可能需要处理更复杂的性别问题(进行中的性别变更或跨性别),最好的方法是使用可能值的参考表:

CREATE TABLE static_gender (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    Name varchar(10),
    Description varchar(100)
) ENGINE=INNODB;

最初,您可以使用以下方式加载它:

INSERT INTO static_gender VALUES
(DEFAULT, 'F', 'female'),
(DEFAULT, 'M', 'male');

这样,您可以扩展表格,因为必须使用新的性别值。在您的USER(或其他)表中,存储static_gender_id并通过JOIN获取性别的值。

答案 1 :(得分:3)

就个人而言(因为这是一个有点主观的问题)我会选择ENUM。 MySQL不支持CHECK约束,因此ENUM是确保值为MF(或m或{的唯一方法{1}})。对我来说,这是最重要的一点。

此外,f应该只需要一个字节的存储空间(根据docs),因此它与ENUM或{{1}一样有效存储空间}。

我根本不理解CHAR(1)方法,因为你最终得到这样的查询:

TINYINT

TINYINT是男性还是女性?如果它是男性,是女性SELECT * FROM myTable WHERE gender = 1; ?或者是1?或者也许0?你必须记住要编写(和维护)应用程序的一堆东西;无需添加到那堆。


附录2017-12-01 作者:Ed Gibbs:当我偶然发现一个无关的Google搜索时,重温我的回答......

2方法在具有静态,一维值域(例如,Y / N,To / Cc / Bcc)的用例中具有优点,但它对于性别无效。我的回答是在“你如何将专栏限制为M或F”的书呆子语境中,而不是在更广泛的性别定义背景下。

D Mac的解决方案更加强大和开明,但它仍然不完整,因为它也是单维的,而性别是多维的。

在对任何主观类别(性别,种族,阶级认同,宗教,政治派别,就业状况,民族认同,性取向,性行为等)中对人进行分类时,请考虑他们识别自己的多种方式。并不总是“检查一个单一的盒子”解决方案。

这超越了意识形态。尝试将多维实体分类为单个维度是不准确的,并且不准确会产生成本。