在进入数值和字符串数据类型的叙述之前,让我们回顾并且分析一下 MySQL (或者其他任何 RDBMS)中的数据分类在现实世界中的好处。
RDBMS 中数据分类的重要论据是与效率(数据存储)和速度(数据检索)联系在一起的。要理解这一点,只需考虑反面的论据:假设有一个不存在数据类型的系统,所有的数据都作为字符或字符串存储。在这样的系统中,每一个数字(整数、日期和货币单位)都将作为一个字符串存储,占据的磁盘空间等于字符串中字节的个数。因此,数字 12 345 678 987 654 321 要占用17个字节,而日期06-04-1978 将占用10个字节(如果用单独的列存储日期的每个元素,占用的空间会更多)。
更进一步说,表示为字符串的数字或日期不容易执行操作,相加、相减或相乘这个数据将是一个复杂而又笨重的任务,它要求设计者首先把字符串转换成数值类型,然后在它上面执行计算。很明显,在表示为字符串的数字或日期上执行比较或相等测试也将变得非常困难。比较测试 13>2 为真是显而易见的,但是不论我们怀着多大的自信,测试 “13”>“2”是否为真是非常困难的。同样,从表示为01-04-2003 的 2003年4月1日到表示为 01-09-2004 的 2004年9月1日之前的时间间隔是很明显的,但是当这两个日期都表示为字符串并且系统不知道怎样从它们之中分离日、月和年时,完成这个计算是非常困难的。
数据分类解决了所有这些问题。通过给数据的不同炻强加一个一致的模式,使系统能够识别一个特定的数据属于一个特定的类型,因此可以使用这个类型的特性来操作数据。例如,如果 01-04-2003 标记属于 DATE 类型,则系统让内置的规则通知它如何处理一个 DATE 类型,对这个值进行操作(与其他 DATE 类型相比较,为它添加天或月,并且确定有效值)就变得比较容易了。
强大的数据分类把每个类型与特定的行为联系在一起,执行这些行为可以预防人为错误。最常见的错误是把字符串和数字加在一起。一个弱类型的语言会许可这一点,强类型的语言会立即指出它违反了系统的完整性,并且拒绝承认它。数据分类在不同数据如何相互作用方面排除了不确定性,它可以减少开发者不得不编写的维护系统完整性的代码的数量。
数据分类还可以更有效地利用空间,导致了更小的存储请求,同时提高了性能。例如,如果系统能够把值 12 345 678 987 654 321 识别为一个数字,而不是一个字符串,它将以更有效的形式(一个 8 字节的整数而不是一个 17 字节的字符串)来存储这个数字,因此占用了更少的空间,并且使得在它上面执行的算术运算更加简单。性能效果同样显著:一个 8 字节的整数值处理起来要比一个17 字节的字符串值快速。考虑节省的空间和提高的速度,我们就会知道为什么使用数据类型有更大的优势。
如同宝剑一样,数据分类也存在利弊。性能的合理使用可以导致更小的数据库和表、有效的索引和更快速地执行查询,而类型的无节制的、过度的使用将导致膨胀的表、存储空间的浪费、低效的索引和在性能上的退化。因此,在实现一个数据库驱动应用程序之前,明智的数据库设计者会全面了解系统中可用的各种数据类型以及它们的局限性和长处。没有数据分类的系统在时间和金钱方面都将是昂贵的。