likes
comments
collection
share

数据类型错误带来严重后果!一文读懂怎么正确选择数据类型

作者站长头像
站长
· 阅读数 22

确保数据质量应该是IT专业人员最重要的目标之一。如今,这一点比以往任何时候都更为重要,因为组织依靠数据来驱动其人工智能和机器学习算法。如果你希望做出准确的决策,就需要准确、高质量的数据。无论数据是由人类还是计算机算法进行分析,这一点都是正确的。

在操作性数据库管理系统中,数据完整性意味着始终确保数据的准确和正确。当然,数据完整性有许多方面,例如确保数据在内部数据库管理系统功能、业务含义、实际数据元素的值以及数据元素之间的关系方面都是正确的,以及在请求更改时正确应用更改。

然而,当数据存储在数据库系统中时,必须采取的一个基本步骤是定义其适当的数据类型和长度。通过在创建表时为每个列指定适当的数据类型,数据库管理系统会自动确保只存储正确类型的数据。试图插入或更新非符合值的过程将被拒绝。此外,对于某些数据类型,还会为列分配最大长度,以防止较大的值存储在表中。

通常情况下,需要DBA选择每个列的数据类型和长度,除非数据架构师已经为DBA提供了数据模型。即使是这样,在将逻辑模型转换为物理实现时,可能仍需要进行更改。总体的经验法则应始终选择最接近列正确值域的数据类型。一般而言,遵循以下规则:

  • 如果数据是数字,优先选择SMALLINT、INTEGER或DECIMAL数据类型。对于非常大的数字,也可以使用FLOAT数据类型。 
  • 如果数据是字符,使用CHAR或VARCHAR数据类型。
  • 如果数据是日期和时间,使用DATE、TIME或TIMESTAMP数据类型。 
  • 如果数据是多媒体类型,使用GRAPHIC、VARGRAPHIC、BLOB、CLOB或DBLOB数据类型。

不同数据库管理系统可能使用的实际数据类型名称可能有所不同,但上述通用规则应适用。不幸的是,这些规则并不总是得到遵循。我不知道为什么使用不正确的数据类型如此普遍,但我可以向你保证这确实是存在的。

最常见的数据类型问题之一是将日期存储在字符列中。 这会导致各种问题。是的,每个数据库管理系统产品对日期/时间数据的支持略有不同,但它们都提供了以下优势,而将日期存储在字符列中则无法获得这些优势:

  • 确保只能存储日期和时间数据在定义了日期数据类型的列中。数据库管理系统将不允许在日期数据类型的列中存储非日期值。 
  • 日期/时间列可以进行日期和时间算术运算。如果数据未存储为日期,将一个日期加到另一个日期或从日期中减去一段时间是很难编程的。 
  • 每个数据库管理系统都提供了大量内置函数来操作和转换日期和时间值。
  • 可以使用数据库管理系统的内置命令或函数以多种方式格式化日期/时间列。

所以,下次你看到一个包含'02302022'或其他更荒谬的字符日期列时,请归咎于数据库模式或创建该模式的DBA。

另一个常见的错误是将数字数据定义为字符。 例如,考虑以下场景。需要一个四字节的代码来标识一个实体;所有的代码都是数字,将保持不变。但是,为了报表目的,用户希望代码以前导零打印出来。该列应该定义为CHAR(4)还是SMALLINT?

如果没有正确的编辑检查,插入和更新操作可能会将无效的字母字符放入产品代码中。如果允许临时数据修改,这是一个有效的问题。尽管在生产数据库中可能很少出现这种情况,但如果没有在每个可以修改数据的程序中编码正确的编辑检查,数据完整性问题仍然可能出现。但只指定一个数字数据类型将把责任放在数据库管理系统身上,它应该负责确保数据只包含数字。

选择错误的数据类型也会影响性能。 当列根据其域定义时,关系型优化器可以更好地计算过滤因子和构建适当的访问路径。再次考虑我们的例子。CHAR(4)列比SMALLINT列有更多可能的取值。即使为每个列编码了程序编辑检查,大多数优化器也不知道它们的存在,并且会假设所有字符组合都是允许的。

但是前导零呢?如果数据存储在CHAR(4)列中,我们可以输入带有前导零的数据,然后它们将始终存在。好吧,这个“问题”可以用其他方法解决。最好在访问数据时进行数据转换,而不是试图在一开始就以这种方式存储数据。毕竟,大多数报表和查询工具都具有自动插入前导零的功能。如果你使用程序访问数据,那么在需要时插入前导零也很容易,对吧?

我们只讨论了一些由错误数据类型引起的潜在问题。总的来说,最好为列分配最符合其域中值的数据类型(和长度)。选择适当的数据类型将改善数据质量并基于该数据做出的决策。


作者: Craig S. Mullins

更多技术干货请关注公号“云原生数据库

squids.cn,基于公有云基础资源,提供云上 RDS,云备份,云迁移,SQL 窗口等功能,注册即免费体验。

转载自:https://juejin.cn/post/7242088846603190332
评论
请登录