SQL 数据类型

每个 DBMS 定义其自己的 SQL 类型。 每个 ODBC 驱动程序仅公开关联的 DBMS 定义的那些 SQL 数据类型。 有关驱动程序如何将 DBMS SQL 类型映射到 ODBC 定义的 SQL 类型标识符以及驱动程序如何将 DBMS SQL 类型映射到其自己的特定于驱动程序的 SQL 类型标识符的信息,将通过调用 SQLGetTypeInfo 返回。 通过调用 SQLColAttribute、SQLColumns、SQLDescribeColSQLDescribeParamSQLProcedureColumnsSQLSpecialColumns 来描述列和参数的数据类型时,驱动程序还会返回 SQL 数据类型。

注意

SQL 数据类型包含在实现描述符的SQL_DESC_ CONCISE_TYPE、SQL_DESC_TYPE和SQL_DESC_DATETIME_INTERVAL_CODE字段中。 SQL 数据类型的特征包含在实现描述符的SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_LENGTH和SQL_DESC_OCTET_LENGTH字段中。 有关详细信息,请参阅本附录后面的 数据类型标识符和描述符

给定的驱动程序和数据源不一定支持本附录中定义的所有 SQL 数据类型。 驱动程序对 SQL 数据类型的支持取决于驱动程序符合的 SQL-92 级别。 若要确定驱动程序支持的 SQL-92 语法级别,应用程序使用SQL_SQL_CONFORMANCE信息类型调用 SQLGetInfo 。 此外,给定的驱动程序和数据源可能支持其他特定于驱动程序的 SQL 数据类型。 若要确定驱动程序支持的数据类型,应用程序会调用 SQLGetTypeInfo。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。 有关特定数据源中的数据类型的信息,请参阅该数据源的文档。

重要

本附录中的表只是指南,显示 SQL 数据类型的常用名称、范围和限制。 给定的数据源可能仅支持列出的某些数据类型,受支持数据类型的特征可能与列出的数据类型不同。

下表列出了所有 SQL 数据类型的有效 SQL 类型标识符。 该表还列出了 SQL-92 (中相应数据类型的名称和说明(如果存在) )。

SQL 类型标识符[1] 典型 SQL 数据

type[2]
典型类型说明
SQL_CHAR CHAR (n) 字符串长度固定 n 的字符串。
SQL_VARCHAR VARCHAR (n) 具有最大字符串长度 n 的可变长度字符串。
SQL_LONGVARCHAR LONG VARCHAR 变长字符数据。 最大长度取决于数据源。[9]
SQL_WCHAR WCHAR (n) 固定字符串长度 n 的 Unicode 字符串
SQL_WVARCHAR VARWCHAR (n) 最大字符串长度 n 的 Unicode 可变长度字符串
SQL_WLONGVARCHAR LONGWVARCHAR Unicode 变长字符数据。 最大长度取决于数据源
SQL_DECIMAL DECIMAL (ps) 带符号的精确数值,精度至少为 p 和小数位数 s。 (最大精度为 driver-defined。) (1 <= p<= 15; s<= p) 。[4]
SQL_NUMERIC numeric (ps) 带符号的精确数值,精度 为 p ,小数位数 s (1 <= p<= 15; s<= p) 。[4]
SQL_SMALLINT SMALLINT 精度为 5 且小数位数为 0 的精确数值 (有符号:-32,768 <= n<= 32,767,unsigned: 0 <= n<= 65,535) [3]。
SQL_INTEGER INTEGER 精度为 10 且刻度为 0 的精确数值 (有符号: -2[31] <= n<= 2[31] - 1,unsigned: 0 <= n<= 2[32] - 1) [3]。
SQL_REAL REAL 二进制精度为 24 (零或绝对值为 10[-38] 到 10[38]) 的有符号、近似数值和数值。
SQL_FLOAT FLOAT (p) 带符号的近似数值,二进制精度至少为 p。 (最大精度为 driver-defined.) [5]
SQL_DOUBLE DOUBLE PRECISION 二进制精度为 53 (零或绝对值为 10[-308] 到 10[308]) 的有符号、近似数值。
SQL_BIT BIT 单位二进制数据。[8]
SQL_TINYINT TINYINT 精度为 3 且刻度为 0 的精确数值 (有符号:-128 <= n<= 127,unsigned: 0 <= n<= 255) [3]。
SQL_BIGINT BIGINT 精度为 19 (的精确数值(如果有符号) )或 20 ((如果无符号) 且刻度 0 (有符号):-2[63] <= n<= 2[63] - 1,unsigned: 0 <= n<= 2[64] - 1) [3],[9]。
SQL_BINARY BINARY (n) 固定长度 n 的二进制数据。[9]
SQL_VARBINARY VARBINARY (n) 最大长度 n 的可变长度二进制数据。 最大值由用户设置。[9]
SQL_LONGVARBINARY LONG VARBINARY 变长二进制数据。 最大长度取决于数据源。[9]
SQL_TYPE_DATE[6] DATE 符合公历规则的年、月和日字段。 (请参阅本附录后面的 公历约束。)
SQL_TYPE_TIME[6] TIME (p) Hour、minute 和 second 字段,有效值为 00 到 23 小时,有效值为 00 到 59 分钟,有效值为秒 00 到 61。 精度 p 表示秒精度。
SQL_TYPE_TIMESTAMP[6] TIMESTAMP (p) 年、月、日、小时、分钟和秒字段,具有为 DATE 和 TIME 数据类型定义的有效值。
SQL_TYPE_UTCDATETIME UTCDATETIME 年、月、日、小时、分钟、秒、utchour 和 utcminute 字段。 utchour 和 utcminute 字段的精度为 1/10 微秒。
SQL_TYPE_UTCTIME UTCTIME Hour、minute、second、utchour 和 utcminute 字段。 utchour 和 utcminute 字段的精度为 1/10 微秒。
SQL_INTERVAL_MONTH[7] INTERVAL MONTH (p) 两个日期之间的月数; p 是间隔前导精度。
SQL_INTERVAL_YEAR[7] INTERVAL YEAR (p) 两个日期之间的年数; p 是间隔前导精度。
SQL_INTERVAL_YEAR_TO_MONTH[7] INTERVAL YEAR (p) TO MONTH 两个日期之间的年数和月数; p 是间隔前导精度。
SQL_INTERVAL_DAY[7] INTERVAL DAY (p) 两个日期之间的天数; p 是间隔前导精度。
SQL_INTERVAL_HOUR[7] INTERVAL HOUR (p) 两个日期/时间之间的小时数; p 是间隔前导精度。
SQL_INTERVAL_MINUTE[7] INTERVAL MINUTE (p) 两个日期/时间之间的分钟数; p 是间隔前导精度。
SQL_INTERVAL_SECOND[7] INTERVAL SECOND (pq) 两个日期/时间之间的秒数; p 是间隔前导精度, q 是间隔秒精度。
SQL_INTERVAL_DAY_TO_HOUR[7] INTERVAL DAY (p) TO HOUR 两个日期/时间之间的天数/小时数; p 是间隔前导精度。
SQL_INTERVAL_DAY_TO_MINUTE[7] INTERVAL DAY (p) TO MINUTE 两个日期/时间之间的天数/小时/分钟数; p 是间隔前导精度。
SQL_INTERVAL_DAY_TO_SECOND[7] INTERVAL DAY (p) TO SECOND (q) 两个日期/时间之间的天数/小时/分钟/秒数; p 是间隔前导精度, q 是间隔秒精度。
SQL_INTERVAL_HOUR_TO_MINUTE[7] INTERVAL HOUR (p) TO MINUTE 两个日期/时间之间的小时/分钟数; p 是间隔前导精度。
SQL_INTERVAL_HOUR_TO_SECOND[7] INTERVAL HOUR (p) TO SECOND (q) 两个日期/时间之间的小时/分钟/秒数; p 是间隔前导精度, q 是间隔秒精度。
SQL_INTERVAL_MINUTE_TO_SECOND[7] INTERVAL MINUTE (p) TO SECOND (q) 两个日期/时间之间的分钟/秒数; p 是间隔前导精度, q 是间隔秒精度。
SQL_GUID GUID 固定长度 GUID。

[1] 这是通过调用 SQLGetTypeInfo 在 DATA_TYPE 列中返回的值。

[2] 这是通过调用 SQLGetTypeInfo 在 NAME 和 CREATE PARAMS 列中返回的值。 NAME 列返回指定,例如 CHAR-,而 CREATE PARAMS 列返回以逗号分隔的创建参数列表,例如精度、小数位数和长度。

[3] 应用程序使用 SQLGetTypeInfoSQLColAttribute 来确定结果集中的特定数据类型或特定列是否为无符号。

[4] SQL_DECIMAL和SQL_NUMERIC数据类型仅在精度上有所不同。 DECIMAL (ps) 的精度是实现定义的十进制精度,不小于 p,而 NUMERIC (ps) 的精度与 p 完全相等。

[5] 根据实现,SQL_FLOAT的精度可以是 24 或 53:如果为 24,则SQL_FLOAT数据类型与 SQL_REAL 相同;如果为 53,则SQL_FLOAT数据类型与SQL_DOUBLE相同。

[6] 在 ODBC 3.x 中,SQL 日期、时间和时间戳数据类型分别SQL_TYPE_DATE、SQL_TYPE_TIME 和 SQL_TYPE_TIMESTAMP;在 ODBC 2.x 中,数据类型为SQL_DATE、SQL_TIME和SQL_TIMESTAMP。

[7] 有关间隔 SQL 数据类型的详细信息,请参阅本附录后面的 “间隔数据类型” 部分。

[8] SQL_BIT数据类型的特征与 SQL-92 中的 BIT 类型不同。

[9] 此数据类型在 SQL-92 中没有相应的数据类型。

本部分提供以下示例。