SQL 数据类型
每个 DBMS 定义其自己的 SQL 类型。 每个 ODBC 驱动程序仅公开关联的 DBMS 定义的那些 SQL 数据类型。 有关驱动程序如何将 DBMS SQL 类型映射到 ODBC 定义的 SQL 类型标识符以及驱动程序如何将 DBMS SQL 类型映射到其自己的特定于驱动程序的 SQL 类型标识符的信息,将通过调用 SQLGetTypeInfo 返回。 通过调用 SQLColAttribute、SQLColumns、SQLDescribeCol、SQLDescribeParam、SQLProcedureColumns 和 SQLSpecialColumns 来描述列和参数的数据类型时,驱动程序还会返回 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 (p,s) | 带符号的精确数值,精度至少为 p 和小数位数 s。 (最大精度为 driver-defined。) (1 <= p<= 15; s<= p) 。[4] |
SQL_NUMERIC | numeric (p,s) | 带符号的精确数值,精度 为 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 (p,q) | 两个日期/时间之间的秒数; 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] 应用程序使用 SQLGetTypeInfo 或 SQLColAttribute 来确定结果集中的特定数据类型或特定列是否为无符号。
[4] SQL_DECIMAL和SQL_NUMERIC数据类型仅在精度上有所不同。 DECIMAL (p,s) 的精度是实现定义的十进制精度,不小于 p,而 NUMERIC (p,s) 的精度与 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 中没有相应的数据类型。
本部分提供以下示例。