【发布时间】:2010-10-08 12:12:16
【问题描述】:
您对常见数据库字段(如名字、姓氏、电子邮件、密码等)使用的大小是多少?我在很多博客、论坛、电子商务等数据库中都看到了这些公共字段。但我不知道这些公共字段的大小是否有一些参考或默认值。所以,我想知道您选择常用字段大小的方法/参考/依据是什么。
【问题讨论】:
标签: sql database database-design field
您对常见数据库字段(如名字、姓氏、电子邮件、密码等)使用的大小是多少?我在很多博客、论坛、电子商务等数据库中都看到了这些公共字段。但我不知道这些公共字段的大小是否有一些参考或默认值。所以,我想知道您选择常用字段大小的方法/参考/依据是什么。
【问题讨论】:
标签: sql database database-design field
部分取决于您的 DBMS。有些,比如 MySQL 5,关心 VARCHAR(n) 列的长度,而不是无限长度的 TEXT 列;其他人,如 PostgreSQL,认为 TEXT 和 VARCHAR(n) 在内部是相同的,除了在 VARCHAR(n) 列上检查长度。在 PostgreSQL 中写类似 VARCHAR(65536) 的东西是愚蠢的;如果您想要一个无限长度的列,请选择 TEXT 并完成它。
当然,有时尝试存储过长的值会破坏您的布局,或者允许某人通过选择没有空格的长名称来滥用系统(例如)。通常我对这样的用户名字段所做的只是选择一个较大的长度,这样任何想要更长用户名的人都会试图造成麻烦; 64 个字符是一个不错的整数值,而且看起来效果很好。对于真实姓名和地址(不像用户名那样经常向用户显示),您需要使用更长的时间。您需要一个足够大的值,它可以接受任何有效的输入,但又不能大到有人可以在字段中塞入一个千兆字节长的字符串来攻击您的系统。 1024 个字符是相当合理的:1k 是一个足够小的文本,可以轻松处理,是一个整数,并且比任何正常的地址行或名称都大。
根据我现在懒得查的相关 RFC,电子邮件地址可以不超过 320 个字符。这就是您的电子邮件字段长度。 结果表明 SMTP 将字段长度限制为 256 个字符;由于电子邮件地址必须用括号括起来,因此最长的有效电子邮件地址实际上是 254 个字符。 (This page 更详细。)所以有您的电子邮件字段长度。
密码应该绝不以明文形式存储,因此您的密码字段应该是字节数组或 BLOB 类型,其长度足以存储您所使用的哈希函数的输出使用(或正在使用的加密组的最大元素,对于更高级的方案,如 SRP-6a)。
【讨论】:
我喜欢 16、32、64、128 或 256
【讨论】:
将您的估计值翻倍。然后将它们加倍以适应 unicode。
具有 varchars 的数据库(几乎所有)都会对旨在保存更长值但没有的字段产生非常小的惩罚。您可以利用它来发挥自己的优势。
【讨论】:
试着反过来想一想:我使用现有数据来获得合理的字段长度。假设您可以访问一个包含真实数据的大型数据库,则可以进行如下快速查询:
SELECT MAX(LEN(lastname)) FROM dbo.MyDatabase
将为您提供所需的一切。
更新:不要使用你得到的确切数字。显然,除非您有一个非常大的样本集,否则请根据您的不确定性将其稍微填充。
【讨论】:
我倾向于考虑一个字段的值可能有多长,然后将其加倍以确保安全。
例如名称:varchar(70) 电子邮件:varchar(200)
【讨论】: