Mysql 我应该使用INT、CHAR或VARCHAR作为社会保险号码吗?

Mysql 我应该使用INT、CHAR或VARCHAR作为社会保险号码吗?,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我正在为一个新项目设计数据库,我不确定是否应该使用INT、CHAR或VARCHAR作为员工的社会保险号码。在我国,SSN由11位数字组成 注意,我将使用ID列作为该表的主键,因此SSN不会用作键 INT注意事项:不可能在列上错误存储文本,这很好,但我无法确保插入的值的位数正确 字符注意事项:我可以确保条目的位数正确,但我不能确定这些是数字,并且SSN的长度将来可能会增加 VARCHAR注意事项:没有其他两种方法的任何优点,但它是最灵活的方法,例如,如果长度发生变化,它不会受到影响 SSN是否有标

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

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

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

字符注意事项:我可以确保条目的位数正确,但我不能确定这些是数字,并且SSN的长度将来可能会增加

VARCHAR注意事项:没有其他两种方法的任何优点,但它是最灵活的方法,例如,如果长度发生变化,它不会受到影响


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

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

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

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


我会使用<代码> VARCHAR/<代码>,因为它提供了你提到的灵活性。

因为不是每个人都来自美国,你应该添加SSN的格式。所以只有0到9的数字。@ JuGrand YEP只有数字0到9,11个数字。你可能首先要考虑加密社会安全号码,在这种情况下,char或binary将是最符合逻辑的。您可能选择+-x或÷SSNs吗?根据MS的定义,大多数条目将需要13个字节作为
varchar
。数据库大小额外增加61%可能会影响决策,具体取决于使用情况。这是值得思考的。@JaazCole:这是SQL Server的,不是MySQL的。谢谢你的反馈@Guffa。我会选择varchar。@BerggreenDK:是的,但无论如何我都不会把它当作钥匙来使用,以免加入它。通常我在表上使用自动增量键,即使它们有一些可能用作键的字段组合,所以我不必考虑它们是否有足够的效率键,或者它们是否随时间一致。为什么是11位数?它是9位数字加上2个连字符(无论如何,你不能用数字来表示)。Int-4字节,9个字符(或数字)。