常用的 SQL 数据类型有哪些

正如 学习 SQL 之前需要了解的基础知识 所述,数据类型是定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。

数据类型用于以下目的。

  • 数据类型允许限制可存储在列中的数据。例如,数值数据类型列只能接受数值。

  • 数据类型允许在内部更有效地存储数据。可以用一种比文本字符串更简洁的格式存储数值和日期时间值。

  • 数据类型允许变换排序顺序。如果所有数据都作为字符串处理,则 1 位于 10 之前,而 10 又位于 2 之前(字符串以字典顺序排序,从左边开始比较,一次一个字符)。

    作为数值数据类型,数值才能正确排序。

在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重影响应用程序的功能和性能。更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。

本文虽然不会完整的介绍数据类型及其如何使用,但介绍了主要的数据类型、用途、兼容性等问题。

一、字符串数据类型

最常用的数据类型是字符串数据类型。它们存储字符串,如名字、地址、电话号码、邮政编码等。

有两种基本的字符串类型,分别为定长字符串和变长字符串。

数据类型说明
CHAR1 ~ 255 个字符的定长字符串。它的长度必须在创建时规定
NCHARCHAR 的特殊形式,用来支持多字节或 Unicode 字符(此类型的不同实现变化很大)
NVARCHARTEXT 的特殊形式,用来支持多字节或 Unicode 字符(此类型的不同实现变化很大)
TEXT(也称为 LONGMEMOVARCHAR变长文本

定长字符串接受长度固定的字符串,其长度是在创建表时指定的。

例如,名字列可允许 30 个字符,而社会安全号列允许 11 个字符(允许的字符数目中包括两个破折号)。定长列不允许多于指定的字符数目。它们分配的存储空间与指定的一样多。

因此,如果字符串 Ben 存储到 30 个字符的名字字段,则存储的是 30 个字符,缺少的字符用空格填充,或根据需要补为 NULL

变长字符串存储任意长度的文本(其最大长度随不同的数据类型和 DBMS 而变化)。有些变长数据类型具有最小的定长,而有些则是完全变长的。不管是哪种,只有指定的数据得以保存(额外的数据不保存)。

既然变长数据类型这样灵活,为什么还要使用定长数据类型?答案是性能。DBMS 处理定长列远比处理变长列快得多。

此外,许多 DBMS 不允许对变长列(或一个列的可变部分)进行索引,这也会极大地影响性能(详细请参阅 SQL 约束、索引和触发器)。

二、数值数据类型

数值数据类型存储数值。多数 DBMS 支持多种数值数据类型,每种存储的数值具有不同的取值范围。

显然,支持的取值范围越大,所需存储空间越多。

此外,有的数值数据类型支持使用十进制小数点(和小数),而有的则只支持整数。

下表列出了常用的数值数据类型。并非所有 DBMS 都支持所列出的名称约定和描述。

数据类型说明
BIT单个二进制位值,或者为 0 或者为 1,主要用于开/关标志
DECIMAL(或 NUMERIC定点或精度可变的浮点值
FLOAT(或 NUMBER浮点值
INT(或 INTEGER4 字节整数值,支持 -2147483648 ~ 2147483647 的数
REAL4 字节浮点值
SMALLINT2 字节整数值,支持 -32768 ~ 32767 的数
TINYINT1 字节整数值,支持 0 ~ 255 的数

三、日期和时间数据类型

所有 DBMS 都支持用来存储日期和时间值的数据类型(见下表)。与数值一样,多数 DBMS 都支持多种数据类型,每种具有不同的取值范围和精度。

数据类型说明
DATE日期值
DATETIME(或 TIMESTAMP日期时间值
SMALLDATETIME日期时间值,精确到分(无秒或毫秒)
TIME时间值

四、二进制数据类型

二进制数据类型是最不具有兼容性(幸运的是,也是最少使用)的数据类型。

与迄今为止介绍的所有数据类型(它们具有特定的用途)不一样,二进制数据类型可包含任何数据,甚至可包含二进制信息,如图像、多媒体、字处理文档等。

数据类型说明
BINARY定长二进制数据(最大长度从 255B 到 8000B,有赖于具体的实现)
LONG RAW变长二进制数据,最长 2GB
RAW(某些实现为 BINARY定长二进制数据,最多 255B
VARBINARY变长二进制数据(最大长度一般在 255B 到 8000B 间变化,依赖于具体的实现)

(完)