整数与数据库中的字符串

时间:2009-04-14 14:19:31

标签: database language-agnostic database-design

在数据库中定义数据类型时,我总是遇到选择是使用整数还是字符串来存储某些“数字”数据的问题。

说我正在构建Yet Another Address Book并且有一个邮政编码字段。如果邮政编码总是一个4位数字,我将其存储为哪种数据类型?整数还是字符串?从技术上讲,它是一个整数,但我没有对它进行任何计算,我只是将它吐出一张表。如果我想通过邮政编码对表格进行排序,你的意见会改变吗?

现在,我并不傻。我确实认识到对整数的有效需求,例如页面查看和唯一用户或登录用户和访客用户。但是如何存储torrent中有多少文件呢?整数还是字符串?

16 个答案:

答案 0 :(得分:37)

在我的国家/地区,邮政编码也始终为4位数。但第一个数字可以为零。

如果将“0700”存储为整数,则可能会遇到很多问题:

  • 可以将其视为八进制值
  • 如果以十进制值正确读取,则会变为“700”
  • 当您获得值“700”时,您必须记住添加零
  • 我不添加零,稍后,你怎么知道“700”是“0700”,还是有人输错了“7100”?

从技术上讲,我们的邮政编码实际上是字符串,即使它总是4位数。

您可以将它们存储为整数,以节省空间。但请记住,这是一个简单的DB技巧,并且要注意引导零。

  

但是要存储多少呢   文件在torrent中?整数或   字符串?

这显然是一个整数。

答案 1 :(得分:28)

我总是使用以下规则:

如果您计划对其执行数学计算(添加/减去/等),请将其设为整数或其他数值数据类型。

如果您不打算在该字段上执行任何类型的数学计算,请将其存储为字符串。

在邮政编码的例子中,您永远不应该有时间需要添加邮政编码,或者将两个邮政编码一起减去或相乘。数学函数通常不用于邮政编码,因为它们用作标识符而不是数量。因此,您应将邮政编码存储为字符串数据类型

答案 2 :(得分:10)

在我看来,对于邮政编码,你必须使用字符串,因为你可以使用以零(09100)为标准的邮政编码,如果你使用整数,它将是9100:排序不是问题,因为仍然有一个字母订单('09100'来自'09101')。 对于存储文件编号,我希望有一个整数,因此您在编制/减少其编号时没有任何问题。所以整数vs字符串取决于你的用途!

答案 3 :(得分:9)

这是一个语义问题。您正在尝试确定适当的存储数据类型,这可能是一个棘手的问题。最好的经验法则是,如果需要将数据用作整数,则将数据存储为整数。

换句话说,由于您永远不会将邮政编码用作数字,因此将其存储为一个没有意义。 看起来的数据并不重要,重要的是 。邮政编码是一个数字吗?不,这是一串恰好由完全数字字符组成的字符串。因此,邮政编码最好存储为字符串。

答案 4 :(得分:6)

就邮政编码而言,这是典型的英国邮政编码:

EC2R 6PK

在大学里,我的数据库讲师告诉我一些困扰我的事情,并且在15年后仍然存在:

  

如果对其进行算术运算,请存储   它作为一个数字。否则就是了   字符串。

坦率地说,我认为你的建议不会出错。

显然你不对邮政编码进行算术运算,因此它们就是字符串。

答案 5 :(得分:5)

邮政编码不是数字:它是代码或标识符。这同样适用于电话号码。

torrent中的文件数是整数。

在这种情况下,您可以创建CHECK CONSTRAINT LIKE '[09][09][09][09]'以在数据库级别保持数据正确。

答案 6 :(得分:2)

对于邮政编码,我会选择一个字符串。它本质上不是整数。它只是一个标识符,它也可以是一系列的四个字符。

至于torrent中的文件数量,应为整数。

答案 7 :(得分:2)

'0000'是邮政编码吗?它与'0'不同吗?

如果它始终是一个四位数字,我总是将它存储为4位数,这将指向将其保持为字符串。

答案 8 :(得分:1)

我不使用数值数据类型,除非我希望对数据进行数学运算。为什么风险在将来找到问题,因为你“确定”的东西总是一个人决定将非数字字符放入的数字。

如果你不打算做数学,那就把它变成一个字符串。

答案 9 :(得分:1)

同样值得记住的是,并非所有国家的所有邮政编码都只是数字。仅仅因为你现在在加拿大没有任何地址并不意味着你没有任何东西。我总是遵守规则,如果你想做数学计算将它存储在数字类型中,如果它只是一个代码(邮政编码,电话,SSN,部分编号等),那么我将它存储为字符串。您想要避免的是每次调用时将数据不必要地转换为另一种格式(例如,如果您将邮政编码存储为数字或代码以将字符串转换为用于计算的数字,则添加前导零的代码)。如果您需要重复执行这些操作,这些操作可能很昂贵,特别是当表很大并且您最终必须在where子句中进行转换时。最好以您需要的方式存储数据。

答案 10 :(得分:0)

邮政编码是字符串。对于某些命令,这些字符串可能包含数字的onl,但这不会使它们成为整数。迟早你的potal系统会用完数字并决定开始使用字母。如果您的数据库使用整数作为邮政编码字段,那么您将处于深度doo-doo。

底线 - 如果你不对它进行算术运算,它可能不是真正的数字。

答案 11 :(得分:0)

关键决定因素imho是应用程序是否需要对值进行数值算术计算,否则,使用整数的唯一原因是降低存储要求(“可能”对性能很重要)在关键应用程序中 - 通过减少表索引的宽度来增加索引性能,例如)但是否则,通常并不重要...

如果不需要对值进行算术运算,那么最好使用字符串。

答案 12 :(得分:0)

有时“总是”意味着“下个月”。在我的职责生命周期内,我不会指望4位数字代码不会使用字母数字。

SQL的一些方言支持像NUMBER(4)这样的dataype。这很像字符串,但字母表是0到9。

答案 13 :(得分:0)

即使您不希望对其执行数学运算,我也认为将邮政编码存储为数字没有问题。

在我们的公司数据仓库中,我们是来自许多遗留系统的数据的接收者。结果,我们看到使用了大量垃圾数据。

以我们的情况为例,我们有一个地理标识符,它是一个零填充的4位“数字”值。此字段通常用于将表连接在一起。

我会选择以下两种方法之一: 1)将列声明为长度为4的char字段并添加CONSTRAINT LIKE'[09] [09] [09] [09]' 2)将其定义为数字长度4,如果用户需要,则将值格式化为仅显示。

方法数字1为您节省了不断格式化的麻烦,这没什么大不了的,但如果您经常过滤甚至索引/加入列,我会考虑说我们选择了#2选项。

第三个原因是我的经验是,在向数据库添加约束或者无知时,人们只是懒惰。我个人认为这更懒惰。我发现确实存在的约束主要应用于最初捕获数据的应用程序中的编辑,并且这些编辑不会统一应用。

因此,我们的数据仓库最终会收到各种变化,包括用零填充不一致或证明价值的合理性。

当您将某些内容定义为INTEGER时,您会自动获得更高效的存储空间,尤其是在列上编制索引,并编辑每个人都理解的内容,并且更有可能由各种能力的数据库设计者在遗留系统中一致地应用。

我对选项#1没有问题,除了在索引中使用字段以及我对一旦你接受一个字段作为apha数字的方法的关注,人们往往会抛出更多的垃圾。< / p>

以我们的Peoplesoft员工标识符为例。有人决定在员工6-char零填充“数字”前添加一个“X”,以指明该员工是承包商。这违反了我的个人做法,即不将单独的信息组合成单个字段。这导致各种系统中出现各种不一致问题。如果此字段是数字,则没有人会尝试这样做。

评论

答案 14 :(得分:0)

了解您正在使用的数据的语义总是很重要。让我在示例中解释一下。

考虑您要在数据库中存储PIN。要回答您应该使用的数据类型,您必须回答PIN(Personal identification number)的真正含义。

  1. 如果它真的是一个数字,因为它的名字确实表示,那么我没有看到任何理由为什么它不应该表示为整数。

    有些人可能会争辩说你无法区分0001和01.显然他们不认为PIN是一个数字,如果他们正在使用这样的语义,他们应该使用字符串。

    注意:如果PIN长度固定为4个数字,它们仍然可以使用整数,因为任何数字都将始终填充前导零并且将完全相同(0001将与01相同) - 但这些固定长度限制是数字的典型限制,以避免错误输入。

  2. 如果语义明确指出PIN是一个数字,即PIN 0001与PIN 01完全相同,我会使用整数表示。

  3. 因此,在您的情况下,理解postal code语义非常重要。这种语义在不同的国家可能会有所不同(甚至会随着时间的推移而变化),因此您想要使用它也很重要。为了涵盖所有类型的邮政编码甚至可能的更改,我会考虑使用更抽象的数据类型或只是一个字符串(我相信已经存在包含更多字符而不仅仅是数字的语义)。

    我不建议遵循简化的规则,例如关于数据表示的算术运算的规则。如果您不想对数据执行数学运算,那么这并不意味着您将来有时不会想要。

    您拥有数据并且想要存储它,以某种方式表示它 - 只需考虑您正在使用的是什么。

答案 15 :(得分:0)

仅在必须使用数字字段执行算术运算时,才应使用数字字段。否则,只需使用string / varchar / etc