Answers:
有人会发布一个比这更好的答案,但只是想指出一点,我个人不会将电话号码存储在任何类型的整数字段中,主要是因为:
总的来说,我似乎几乎只使用:
当然也有例外,但我发现这涵盖了大多数可能发生的情况。
这是我使用的一些常见数据类型(尽管我不是专业人士):
| Column | Data type | Note
| ---------------- | ------------- | -------------------------------------
| id | INTEGER | AUTO_INCREMENT, UNSIGNED |
| uuid | CHAR(36) | or CHAR(16) binary |
| title | VARCHAR(255) | |
| full name | VARCHAR(70) | |
| gender | TINYINT | UNSIGNED |
| description | TINYTEXT | often may not be enough, use TEXT
instead
| post body | TEXT | |
| email | VARCHAR(255) | |
| url | VARCHAR(2083) | MySQL version < 5.0.3 - use TEXT |
| salt | CHAR(x) | randomly generated string, usually of
fixed length (x)
| digest (md5) | CHAR(32) | |
| phone number | VARCHAR(20) | |
| US zip code | CHAR(5) | Use CHAR(10) if you store extended
codes
| US/Canada p.code | CHAR(6) | |
| file path | VARCHAR(255) | |
| 5-star rating | DECIMAL(3,2) | UNSIGNED |
| price | DECIMAL(10,2) | UNSIGNED |
| date (creation) | DATE/DATETIME | usually displayed as initial date of
a post |
| date (tracking) | TIMESTAMP | can be used for tracking changes in a
post |
| tags, categories | TINYTEXT | comma separated values * |
| status | TINYINT(1) | 1 – published, 0 – unpublished, … You
can also use ENUM for human-readable
values
| json data | JSON | or LONGTEXT
以我的经验,名字/姓氏字段至少应包含48个字符-有些国家(例如马来西亚或印度)的名字格式很长。
您应该始终将电话号码和邮政编码视为文本,而不是数字。给出的正常原因是,邮政编码以0开头,在某些国家/地区,电话号码也可以以0开头。但真正的原因是,它们不是数字 -它们是恰好组成的标识符数字位数(并且忽略了像加拿大这样的邮政编码中带有字母的国家/地区)。因此,将它们存储在文本字段中。
在MySQL中,您可以将VARCHAR字段用于此类信息。虽然听起来很懒,但这意味着您不必太在乎正确的最小大小。
VARCHAR(255)
来说却是正确的。
由于您将要处理长度可变的数据(名称,电子邮件地址),因此您需要使用VARCHAR。VARCHAR字段占用的空间量为[field length]
+ 1个字节,最大长度为255,因此,我不必担心要找到一个理想的大小。看看您想像的最长的长度,然后将其加倍并将其设置为VARCHAR限制。那说...:
我通常将电子邮件字段设置为VARCHAR(100)-我还没有想到这个问题。我设置为VARCHAR(50)的名称。
正如其他人所说,电话号码和邮政编码实际上不是数字值,它们是包含数字0-9(有时甚至更多!)的字符串,因此您应该将它们视为字符串。VARCHAR(20)应该足够了。
请注意,如果您将电话号码存储为整数,许多系统将假定以0开头的数字是八进制(以8为底)的数字!因此,完美有效的电话号码“ 0731602412”将作为十进制数字“ 124192010”输入数据库中!
我正在做同一件事,这就是我所做的。
我为名称,地址,电子邮件和数字使用了单独的表,每个表都有一个NameID列,该列是除Name表以外的所有内容的外键,在该表上它是主群集键。我使用MainName和FirstName代替LastName和FirstName来进行业务输入和个人输入,但是您可能不需要这样做。
NameID列在所有表中都将成为smallint,因为我敢肯定我输入的条目不会超过32000。几乎所有其他内容都是varchar(n),范围从20到200,这取决于您要存储的内容(生日,评论,电子邮件,很长的名字)。这实际上取决于您要存储什么类型的东西。
我从中偏离了Numbers表。我将其设置为五列,分别标记为NameID,Phone#,CountryCode,Extension和PhoneType。我已经讨论过NameID。电话号码为varchar(12),检查约束如下所示:CHECK(电话号码类似'[0-9] [0-9] [0-9]-[0-9] [0-9] [0 -9]-[0-9] [0-9] [0-9] [0-9]')。这样可以确保只有我想要的内容才能进入数据库,并且数据保持非常一致。我将扩展名和国家/地区代码称为可为null的smallint,但是如果您愿意的话,可以使用varchar。PhoneType为varchar(20),并且不能为空。
希望这可以帮助!