Enr*_*ico 108 mysql database types
我正在建立一个非常小的MySQL数据库,存储,名字,姓氏,电子邮件和电话号码,我正在努力为每个字段找到"完美"的数据类型.我知道没有一个完美的答案,但必须有一些常见的常用惯例,例如这些.例如,我已经确定一个未格式化的美国电话号码太大而无法存储为unsigned int,它必须至少是一个bigint.
因为我相信其他人可能会觉得这很有用,我不想把我的问题限制在我上面提到的字段中.
哪些数据类型适用于常见数据库字段?电话号码,电子邮件和地址等字段?
da5*_*5id 67
有人会发布一个比这更好的答案,但只是想说明个人我永远不会在任何类型的整数字段中存储电话号码,主要是因为:
总的来说,我似乎几乎只使用:
当然也有例外,但我发现它涵盖了大多数可能性.
yen*_*sun 36
以下是我使用的一些常见数据类型(虽然我不是很专业):
| 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
Run Code Online (Sandbox Code Playgroud)
sta*_*san 16
根据我的经验,名字/姓氏字段应至少为48个字符 - 来自马来西亚或印度等一些国家的名称很长.
电话号码和邮政编码应始终视为文本,而不是数字.给出的正常理由是有一些以0开头的邮政编码,在某些国家,电话号码也可以从0开头.但真正的原因是它们不是数字 - 它们是碰巧组成的标识符数字的数字(并且忽略了像加拿大这样在其邮政编码中有字母的国家).因此,将它们存储在文本字段中.
在MySQL中,您可以将VARCHAR字段用于此类信息.虽然它听起来很懒惰,但这意味着你不必太在意正确的最小尺寸.
由于您将要处理可变长度的数据(名称,电子邮件地址),因此您需要使用VARCHAR.VARCHAR字段占用的空间量为[field length]
+ 1个字节,最大长度为255,因此我不会太担心尝试找到完美的大小.看看你想象的可能是最长的长度,然后加倍并将其设置为VARCHAR限制.那说......:
我通常将电子邮件字段设置为VARCHAR(100) - 我还没有提出问题.名称我设置为VARCHAR(50).
正如其他人所说,电话号码和邮政编码实际上并不是数字值,它们是包含数字0-9(有时甚至更多!)的字符串,因此您应该将它们视为字符串.VARCHAR(20)应该足够了.
请注意,如果您将电话号码存储为整数,许多系统将假设以0开头的数字是八进制(基数为8)!因此,完全有效的电话号码"0731602412"将以十进制数"124192010"进入您的数据库!
使用:INT(11)
。
MySQL 索引将能够最快地解析 int 列表。
使用:BINARY(x)
、 或BLOB(x)
。
您可以将安全令牌等以十六进制形式直接存储在 BINARY(x) 或 BLOB(x) 中。要从binary
-type 检索,请使用SELECT HEX(field)...
或SELECT ... WHERE field = UNHEX("ABCD....")
。
使用:DATETIME
、DATE
、 或TIME
。
DATETIME
如果您需要存储日期和时间(而不是一对字段),请始终使用,因为DATETIME
索引更适合 MySQL 中的日期比较。
使用:(BIT(1)
仅限 MySQL 8。)否则,使用BOOLEAN(1)
.
BOOLEAN
实际上只是 的别名TINYINT(1)
,它实际上存储 0 到 255(不完全是 true/false,是吗?)。
使用:INT(11)
。
VARCHAR 或其他类型的字段不能与SUM()
等函数一起使用。
使用:文本。
最大限制为 65,535。
使用:中等文本。
最大限制为 16,777,215。
使用:长文本。
最大限制为 4,294,967,295。
使用 :VARCHAR(255)
。
UTF-8 字符每个可见字符可以占用三个字符,并且某些文化不区分名字和姓氏。此外,不同文化对于哪个名字在前、哪个名字在后可能存在分歧。您应该将这些字段命名为Person.GivenName
和Person.FamilyName
。
使用 :VARCHAR(256)
。
电子邮件路径的定义在1982 年的RFC821中设定。电子邮件的最大限制在 2001 年的RFC2821中设定,并且这些限制在 2008 年的RFC5321中保持不变。(参见第 4.5.3.1 节)大小限制和最小值。) 2004 年发布的RFC3696错误地将电子邮件地址限制引用为320
字符,但这是一个“仅供参考”的 RFC,根据其简介明确“未定义任何标准”,因此请忽略它。
使用:VARCHAR(255)
。
您永远不知道电话号码何时会采用“1800...”、“1-800”或“1-(800)”的形式,或者是否以“ext.42”或“ext.42”结尾。找苏珊”。
使用:VARCHAR(10)
。
您将获得类似12345
或 的数据12345-6789
。使用验证来清理此输入。
使用:VARCHAR(2000)
。
官方标准支持的 URL 比这长得多,但很少有现代浏览器支持超过 2,000 个字符的 URL。请参阅这个答案:What is the Maximum length of a URL in different browsers?
使用:DECIMAL(11,2)
。
它上升到11。