我正在建立一个非常小的MySQL数据库,存储,名字,姓氏,电子邮件和电话号码,我正在努力为每个字段找到"完美"的数据类型.我知道没有一个完美的答案,但必须有一些常见的常用惯例,例如这些.例如,我已经确定一个未格式化的美国电话号码太大而无法存储为unsigned int,它必须至少是一个bigint.
因为我相信其他人可能会觉得这很有用,我不想把我的问题限制在我上面提到的字段中.
哪些数据类型适用于常见数据库字段?电话号码,电子邮件和地址等字段?
有人会发布一个比这更好的答案,但只是想说明个人我永远不会在任何类型的整数字段中存储电话号码,主要是因为:
你不需要用它做任何算术,并且
迟早某人会尝试(做类似的事情)在他们的区号附近加上括号.
总的来说,我似乎几乎只使用:
INT(11)用于任何ID或引用另一个ID的任何内容
时间戳的DATETIME
VARCHAR(255)保证不超过255个字符(页面标题,名称等)
TEXT几乎所有其他内容.
当然也有例外,但我发现它涵盖了大多数可能性.
以下是我使用的一些常见数据类型(虽然我不是很专业):
| 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.VARCHAR字段占用的空间量为[field length]
+ 1个字节,最大长度为255,因此我不会太担心尝试找到完美的大小.看看你想象的可能是最长的长度,然后加倍并将其设置为VARCHAR限制.那说......:
我通常将电子邮件字段设置为VARCHAR(100) - 我还没有提出问题.名称我设置为VARCHAR(50).
正如其他人所说,电话号码和邮政编码实际上并不是数字值,它们是包含数字0-9(有时甚至更多!)的字符串,因此您应该将它们视为字符串.VARCHAR(20)应该足够了.
请注意,如果您将电话号码存储为整数,许多系统将假设以0开头的数字是八进制(基数为8)!因此,完全有效的电话号码"0731602412"将以十进制数"124192010"进入您的数据库!