t0m*_*t0m 6 mysql database sqldatatypes
哪种方法可以在MY SQL数据库中存储性别?我对这个问题感到有点困惑,因为不同的人以不同的方式表达.有人建议将它存储在INT中更好,但是其他人建议使用TINYINT和Enum,但是其他人建议将它存储在CHAR(1)M for Male和F For Female中.
此外,在听到http://en.wikipedia.org/wiki/ISO_5218时会更加令人怀疑
但是在我看来将它存储在CHAR中是一个好主意,因为它提供了比ENUM更强大的功能?我也关注可伸缩性,想知道存储数百万条记录的更好解决方案.
非常感谢专家提出的宝贵建议.
如果您可能不得不处理更复杂的性别问题(进行中的性别变化或跨性别),最好的方法是使用可能值的参考表:
CREATE TABLE static_gender (
ID INT AUTO_INCREMENT PRIMARY KEY,
Name varchar(10),
Description varchar(100)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)
最初,您可以使用以下命令加载:
INSERT INTO static_gender VALUES
(DEFAULT, 'F', 'female'),
(DEFAULT, 'M', 'male');
Run Code Online (Sandbox Code Playgroud)
这样,您可以扩展表格,因为必须使用新的性别值.在您的USER(或其他)表中,您static_gender_id可以使用JOIN 存储并获取性别的值.
就个人而言(因为这是一个有点主观的问题)我会选择ENUM. MySQL 不支持CHECK约束,因此这ENUM是真正确保值是Mor F(or (or mor f)的唯一方法。对我来说,这是最重要的一点。
此外, theENUM应该只需要一个字节的存储空间(根据docs),因此它在存储方面与CHAR(1)or一样有效TINYINT。
我根本不理解这种TINYINT方法,因为你最终会得到这样的查询:
SELECT * FROM myTable WHERE gender = 1;
Run Code Online (Sandbox Code Playgroud)
是1男的还是女的?如果是男的,是女的0吗?或者是2吗?或者也许16?您已经必须记住一堆东西来编写(和维护)应用程序;无需添加到该堆中。
Ed Gibbs 的附录 2017-12-01:当我在一个不相关的 Google 搜索中偶然发现它时重新审视我的答案......
该ENUM方法在具有静态、单维值域(例如,Y/N、To/Cc/Bcc)的用例中具有优势,但它不适用于性别。我的回答是在“你如何将专栏限制为 M 或 F”的书呆子上下文中,而不是在更广泛的性别定义上下文中。
D Mac 的解决方案更加稳健和开明,但它仍然不完整,因为它也是单维的,而性别是多维的。
在将人类归入任何主观类别(性别、种族、阶级认同、宗教、政治派别、就业状况、种族认同、性取向、恋情等)时,请考虑他们可以通过多种方式识别自己。并不总是有“选中一个框”的解决方案。
这超越了意识形态。试图将多维实体归类为单一维度是不准确的,不准确是有代价的。