为数据库列分配错误数据类型的陷阱

135 阅读2分钟

最近在一个网络应用程序的调试过程中,出现了一个在数据库设计中经常出现的问题--为数据库字段指定错误的数据类型。

在数字字段中存储数字数据,什么时候不建议这样做?

许多程序员在设计数据库模式时,默认为数字字段使用数字数据类型--如邮政编码、电话号码、年龄、价格等。然而,并不是每个数字值都需要存储为数字类型。很多时候,谨慎的做法是将数字值存储为 "文本 "类型--具体来说是 "varchar"。

以邮政编码为例,它通常被分配为数字类型。然而,如果你检查美国的邮编,你可以看到许多邮编都是以0开头的。下面是几个随机的例子。

07097	JERSEY CITY
07403	BLOOMINGDALE
00610	ANASCO
01541	PRINCETON

我有一个包含约43,000个美国邮编的数据库,其中有3,000个(约7%)邮编以0开头。将这些邮编保存在一个数字字段中会截断最初的零,在这个过程中会丢失信息。

这实际上发生在最近的一个客户项目中。我正在调试一个传统的网络应用程序,该程序被地面服务团队用来分配家庭电视安装的服务人员。当一个新的请求到达时,离客户地点最近的技术员被分配到工作。这需要使用客户的邮政编码和技术人员的位置来计算距离。然而,应用程序有时会给出错误的距离,将位置距离说成是几千英里,而实际上只有12英里。仔细研究后发现,相应的邮政编码被截断了,因此出现了错误的距离。

数据丢失可能发生在将 "邮编 "CSV导入数据库的时候。由于数据库中的 "邮编 "字段被设置为数字类型,在导入时,最初的零被截断了。

因此,什么时候应该将数字数据存储在数字类型的字段中,什么时候应该存储在 "文本 "类型中。经验法则是,如果你要对数字数据进行计算--加法、减法、平均法等等,那么就使用数字字段类型来存储数据。你不会,或者说不能对邮政编码或电话号码进行任何有意义的计算,所以将其存储为文本 "char "类型是明智的。

将邮政编码与 "年龄 "字段进行对比。人们可以对它进行各种计算--平均、最小、最大、标准偏差等。因此,人们可以,或者说应该,为'年龄'使用数字字段类型。