附录D SQL入门之SQL数据类型
正如 第1课所述,数据类型是定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。
数据类型用于以下目的。
- 数据类型允许限制可存储在列中的数据。例如,数值数据类型列只能接受数值。
- 数据类型允许在内部更有效地存储数据。可以用一种比文本字符串更简洁的格式存储数值和日期时间值。
- 数据类型允许变换排序顺序。如果所有数据都作为字符串处理,则1位于10之前,而10又位于2之前(字符串以字典顺序排序,从左边开始比较,一次一个字符)。作为数值数据类型,数值才能正确排序。
在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重影响应用程序的功能和性能。更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。
本附录虽然不是关于数据类型及其如何使用的完整教材,但介绍了主要的数据类型、用途、兼容性等问题。
警告:任意两个DBMS都不是完全相同的
以前曾经说过,现在还需要再次提醒。不同DBMS的数据类型可能有很大的不同。在不同DBMS中,即使具有相同名称的数据类型也可能代表不同的东西。关于具体的DBMS支持何种数据类型以及如何支持的详细信息,请参阅具体的DBMS文档。
D.1 字符串数据类型
最常用的数据类型是字符串数据类型。它们存储字符串,如名字、地址、电话号码、邮政编码等。有两种基本的字符串类型,分别为定长字符串和变长字符串(参见表D-1)。
定长字符串接受长度固定的字符串,其长度是在创建表时指定的。例如,名字列可允许30个字符,而社会安全号列允许11个字符(允许的字符数目中包括两个破折号)。定长列不允许多于指定的字符数目。它们分配的存储空间与指定的一样多。因此,如果字符串Ben存储到30个字符的名字字段,则存储的是30个字符,缺少的字符用空格填充,或根据需要补为NULL。
变长字符串存储任意长度的文本(其最大长度随不同的数据类型和DBMS而变化)。有些变长数据类型具有最小的定长,而有些则是完全变长的。不管是哪种,只有指定的数据得以保存(额外的数据不保存)。
既然变长数据类型这样灵活,为什么还要使用定长数据类型?答案是性能。DBMS处理定长列远比处理变长列快得多。此外,许多DBMS不允许对变长列(或一个列的可变部分)进行索引,这也会极大地影响性能(详细请参阅第22课)。
表D-1 串数据类型
数据类型 | 说 明 |
---|---|
CHAR | 1~255个字符的定长字符串。它的长度必须在创建时规定 |
NCHAR | CHAR的特殊形式,用来支持多字节或Unicode字符(此类型的不同实现变化很大) |
NVARCHAR | TEXT的特殊形式,用来支持多字节或Unicode字符(此类型的不同实现变化很大) |
TEXT | (也称为LONG、MEMO或VARCHAR) 变长文本 |
提示:使用引号
不管使用何种形式的字符串数据类型,字符串值都必须括在单引号内。
警告:当数值不是数值时
你可能会认为电话号码和邮政编码应该存储在数值字段中(数值字段只存储数值数据),但是这样做并不可取。如果在数值字段中存储邮政编码01234,则保存的将是数值1234,实际上丢失了一位数字。
需要遵守的基本规则是:如果数值是计算(求和、平均等)中使用的数值,则应该存储在数值数据类型列中;如果作为字符串(可能只包含数字)使用,则应该保存在字符串数据类型列中。
D.2 数值数据类型
数值数据类型存储数值。多数DBMS支持多种数值数据类型,每种存储的数值具有不同的取值范围。显然,支持的取值范围越大,所需存储空间越多。此外,有的数值数据类型支持使用十进制小数点(和小数),而有的则只支持整数。表D-2列出了常用的数值数据类型。并非所有DBMS都支持所列出的名称约定和描述。
表D-2 数值数据类型
数据类型 | 说 明 |
---|---|
BIT | 单个二进制位值,或者为0或者为1,主要用于开/关标志 |
DECIMAL(或NUMERIC) | 定点或精度可变的浮点值 |
FLOAT(或NUMBER) | 浮点值 |
INT(或INTEGER) | 4字节整数值,支持-2147483648~2147483647的数 |
REAL | 4字节浮点值 |
SMALLINT | 2字节整数值,支持-32768~32767的数 |
TINYINT | 1字节整数值,支持0~255的数 |
提示:不使用引号
与字符串不一样,数值不应该括在引号内。
提示:货币数据类型
多数DBMS支持一种用来存储货币值的特殊数值数据类型。一般记为MONEY或CURRENCY,这些数据类型基本上是有特定取值范围的DECIMAL数据类型,更适合存储货币值。
D.3 日期和时间数据类型
所有DBMS都支持用来存储日期和时间值的数据类型(见表D-3)。与数值一样,多数DBMS都支持多种数据类型,每种具有不同的取值范围和精度。
表D-3 日期和时间数据类型
数据类型 | 说 明 |
---|---|
DATE | 日期值 |
DATETIME(或TIMESTAMP) | 日期时间值 |
SMALLDATETIME | 日期时间值,精确到分(无秒或毫秒) |
TIME | 时间值 |
警告:指定日期
不存在所有DBMS都理解的定义日期的标准方法。多数实现都理解诸如2015-12-30或Dec 30th, 2015等格式,但即使这样,有的DBMS还是不理解它们。至于具体的DBMS能识别哪些日期格式,请参阅相应的文档。
提示:ODBC日期
因为每种DBMS都有自己特定的日期格式,所以ODBC创建了一种自己的格式,在使用ODBC时对每种数据库都起作用。ODBC格式对于日期类似于{d ‘2005-12-30’},对于时间类似于{t ‘21:46:29’},而对于日期时间类似于{ts ‘2005-12-30 21:46:29’}。如果通过ODBC使用SQL,应该以这种方式格式化日期和时间。
D.4 二进制数据类型
二进制数据类型是最不具有兼容性(幸运的是,也是最少使用)的数据类型。与迄今为止介绍的所有数据类型(它们具有特定的用途)不一样,二进制数据类型可包含任何数据,甚至可包含二进制信息,如图像、多媒体、字处理文档等(参见表D-4)。
表D-4 二进制数据类型
数据类型 | 说 明 |
---|---|
BINARY | 定长二进制数据(最大长度从255字节到8000字节,有赖于具体的实现) |
LONG RAW | 变长二进制数据,最长2 GB |
RAW(某些实现为BINARY) | 定长二进制数据,最多255字节 |
VARBINARY | 变长二进制数据(最大长度一般在255字节到8000字节间变化,依赖于具体的实现) |
警告:数据类型对比
如果你想看一个数据库比较的实际例子,请考虑本书中用来建立样例表的表创建脚本(参看附录A)。通过比较这些用于不同DBMS的脚本,可看到数据类型匹配是一项多么复杂的任务。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!