哪种方法可以在MY SQL数据库中存储性别?我对这个问题感到有点困惑,因为不同的人以不同的方式表达。有人建议将其存储在 INT 中更好,但其他建议 TINYINT 和枚举,但有些人建议将其存储在CHAR(1)<男性强> M 女性 F
此外,在听到http://en.wikipedia.org/wiki/ISO_5218
时会更加怀疑但是在我看来将它存储在CHAR中是一个好主意,因为它提供了比ENUM更强大的稳健性?我也关注可扩展性,想知道存储数百万条记录的更好解决方案。
非常感谢专家提出的宝贵建议。
答案 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
是确保值为M
或F
(或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的解决方案更加强大和开明,但它仍然不完整,因为它也是单维的,而性别是多维的。
在对任何主观类别(性别,种族,阶级认同,宗教,政治派别,就业状况,民族认同,性取向,性行为等)中对人进行分类时,请考虑他们识别自己的多种方式。并不总是“检查一个单一的盒子”解决方案。
这超越了意识形态。尝试将多维实体分类为单个维度是不准确的,并且不准确会产生成本。