数字与文本的混淆,是指数据库把数量存成文本,或把标签存成数字。屏幕上的值看起来一样,但排序、总和和搜索的表现却不同。考试要求你能察觉症状、说出原因并指出修正方法。
本课接在导入一份小型虚构数据集之后,因为混淆通常就是在导入时产生的。它属于数据库结构与验证。
有哪些症状?
三个快速测试可以显示一列数据是如何存放的。
- 排序测试。 把该列升序排序。数字字段会排成 5、9、12、120。文本字段会排成 12、120、5、9,因为它逐个字符比较。
- 求和测试。 要求求和或求平均。文本列会返回零、报错,或根本没有这个选项。
- 零测试。 查看邮编之类的标签。如果 08000 显示为 8000,说明标签被存成了数字,开头的零已经丢失。
日期也有同样的麻烦。写成 10-03-2024 并存为文本的日期,会按前面的字符排序,而不是按日历排序。
例题详解
一张虚构的库存数量表已被导入。数量是 25、9、120 和 12。
第一步,做排序测试。 升序结果为:12、120、25、9。
第二步,与预期顺序对比。 当作数字时,顺序应是 9、12、25、120。排出来的结果不同,所以有问题。
第三步,解释这个规律。 文本先比较第一个字符。第一个字符分别是 1、1、2 和 9。12 和 120 都以 1 开头,所以排在前面。这两者之间,12 较短,排在 120 之前。接着 25 以 2 开头,9 以 9 开头。12、120、25、9 正是文本排序的结果。
第四步,确认原因。 Quantity 字段的类型是文本。
第五步,修正。 把字段类型改为整数。如果程序询问,确认转换。再排序一次:9、12、25、120。
第六步,用总和核对。 25 + 9 + 120 + 12 = 166。按两两配对验算:25 + 9 = 34,120 + 12 = 132,34 + 132 = 166。现在这个字段可以正确求和了。
要留意的错误
常见的失误是想”修复”文本列,就把所有只含数字的字段都改成数字,连电话号码也不例外。
错误的修复: 为了让它按数值排序,把 Phone 字段改成了整数。以零开头的电话号码变短,那个零不见了。
这个值已经和真实号码不符。很少需要按电话号码排序,所以这次转换解决了一个没人遇到的问题,却制造了一个真实的问题。
改正的方法是先问这一列是做什么用的。如果值要被相加、求平均或当作数额比较,就转换。如果它们是用来识别事物的,就保持文本。如果开头的零已经丢失,就用文本类型重新从源文件导入,找回原来的值。
自我检测
1. 一个文本列含有 7、70 和 8。写出数据库显示的升序结果。
查看答案
7、70、8。 文本比较第一个字符:7、7 和 8。两个以 7 开头的值中,较短的 7 排在前面,然后是 70。
2. 用户对 Price 列求和,程序却给出 0,而价格是 5.50、3.00 和 2.50。可能的原因是什么?修正后的总和是多少?
查看答案
价格被存成了文本,所以无法求和。改成货币或小数后,总和是 5.50 + 3.00 + 2.50 = 11.00。
3. 邮编字段显示 8000,而源文件是 08000。哪里出了问题?怎样修正?
查看答案
邮编被存成了数字,开头的零被去掉了。把字段设为文本,再从源文件重新导入。
下一步
接下来,了解重复的行为什么会破坏计数和总和:解释重复记录为什么重要。如果字段类型需要复习,请回到根据样本数据选择字段类型。然后试做数据库结构与验证练习题组。错题记录与重测队列是记录每一次类型错误的好地方。
这种混淆被点出来之后很容易看见,之前却很难察觉。ICT 线上一对一补习的老师可以和你一起建立快速测试,让你在任何表格上都能找出原因。