我应该使用 INT、CHAR 或 VARCHAR 作为社会安全号码吗? [关闭]

Posted

技术标签:

【中文标题】我应该使用 INT、CHAR 或 VARCHAR 作为社会安全号码吗? [关闭]【英文标题】:Should I use INT, CHAR or VARCHAR for Social Security Number? [closed] 【发布时间】:2014-09-03 23:18:03 【问题描述】:

我正在为一个新项目设计数据库,我不确定是否应该使用 INT、CHAR 或 VARCHAR 作为员工的社会安全号码。在我的国家,SSN 由 11 位数字组成。

请注意,我将使用 ID 列作为此表的主键,因此 SSN 不会用作键。

INT 注意事项:不可能在列上错误地存储文本,这很好,但我无法确保插入的值具有正确的位数.

CHAR 考虑事项:我可以确保条目具有正确的位数,但我不能确定这些是否是数字,并且 SSN 的长度将来可能会增加。

VARCHAR 考虑因素:没有其他两个的任何好处,但它是最灵活的一个,例如,如果长度发生变化也不会受到影响。

SSN 是否有标准数据类型?你们都用什么?

【问题讨论】:

由于不是每个人都来自美国,您应该添加 SSN 的格式。 所以只有0-9的数字? @juergend 是的,只有数字 0-9,11 位数字。 您可能要考虑先加密社会安全号码,在这种情况下,char 或 binary 将是最合乎逻辑的。 您可能是 + - x 还是 ÷ SSN? 【参考方案1】:

虽然 SSN 只是数字,但它并不代表单个数字。您永远不会对整个 SSN 进行任何数字计算,因此将其存储为数字确实没有多大意义。

将其存储为数字将使用更少的空间,但不会太多,因为您需要一个 bigint(8 个字节)来保存一个 11 位数字。使用 varchar 将使用 11 个字节作为字符,另一个字节作为长度,因此差异不足以促使将其存储为数字。

关于验证 SSN 的长度和内容,这实际上是用户界面的工作。数据库不应允许任何有损数据完整性的事情,但无效的 SSN 不会以这种方式造成危害。

我会使用varchar,因为它提供了您提到的灵活性。

【讨论】:

根据 MS 的定义 here,大多数条目作为 varchar 需要 13 个字节。数据库大小额外增加 61% 可能会影响决策,具体取决于使用情况。只是思考的食物。 @JaazCole:那是针对 SQL Server,而不是 mysql。 dev.mysql.com/doc/refman/5.0/en/storage-requirements.html 感谢@Guffa 的反馈。我将使用 varchar。 @BerggreenDK:确实如此,但无论如何我都会避免使用它作为键来避免加入它。通常我会在表上使用自动增量键,即使它们有一些可能用作键的唯一字段组合,这样我就不必考虑它们是否是一个足够有效的键,或者它们是否随着时间的推移保持一致。 为什么选择 bigint?为什么是 11 位数字?它是 9 位数字,外加 2 个连字符(无论如何您都不能用数字表示)。 Int - 4 字节,9 个字符(或数字)。

以上是关于我应该使用 INT、CHAR 或 VARCHAR 作为社会安全号码吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

mysql 中int(10),char(10),varchar(10)的区别

sql 中int nvarchar char VARchar 有啥区别

MYSQL VARCHAR 或 CHAR 用于固定长度字符串

char与varchar的区别

Char和VarChar有啥区别[重复]

(转)mysql数据库中存储数字字段时,选择int和varchar的区别