SQL 数据类型
每个 DBMS 定义自己的 SQL 类型。 每个 ODBC 驱动程序仅公开关联的 DBMS 定义的那些 SQL 数据类型。 驱动程序如何将 DBMS SQL 类型映射到 ODBC 定义的 SQL 类型标识符,以及驱动程序如何通过调用 SQLGetTypeInfo 将 DBMS SQL 类型映射到其自己的特定于驱动程序的 SQL 类型标识符的信息。 驱动程序在通过调用 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 和小数位数 的 精度的有符号、精确数字值。(最大精度为驱动程序定义)。(1 <= p<= 15; s<= p)。[4] |
SQL_NUMERIC | NUMERIC(p,s) | 精度 为 p 和小数位数 的 有符号、精确数字值(1 <= p<= 15; s<= p)。[4] |
SQL_SMALLINT | SMALLINT | 精度为 5 和刻度 0 的精确数值(带符号:-32,768 <= n= 32,767,无符号:0 <= n<<= 65,535)[3]。 |
SQL_INTEGER | INTEGER | 精度为 10 和刻度 0 的精确数值(有符号: -2[31] <= n= 2[31] - 1,无符号: 0 <= n<<= 2[32] - 1)[3]。 |
SQL_REAL | REAL | 带符号、近似、二进制精度为 24 的数值(零值或绝对值 10[-38] 到 10[38])。 |
SQL_FLOAT | FLOAT(p) | 具有至少 p 的二进制精度的带符号、近似数值。 (最大精度是驱动程序定义的。[5] |
SQL_DOUBLE | DOUBLE PRECISION | 具有二进制精度 53(零或绝对值 10[-308] 到 10[308])的带符号、近似数值。 |
SQL_BIT | BIT | 单位二进制数据。[8] |
SQL_TINYINT | TINYINT | 精度为 3 且刻度为 0 的精确数值(有符号: -128 <= n<= 127,无符号: 0 <= n<= 255)[3]。 |
SQL_BIGINT | BIGINT | 精度为 19(如果有符号)或 20(如果无符号)和刻度 0(signed: -2[63] = n= 2[63] <- 1,未符号: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) | 小时、分钟和秒字段,有效值为 00 到 23 小时、00 到 59 分钟的有效值,以及 00 到 61 秒的有效值。 精度 p 表示秒精度。 |
SQL_TYPE_TIMESTAMP[6] | TIMESTAMP(p) | Year、month、day、hour、minute 和 second fields,其有效值已针对 DATE 和 TIME 数据类型定义。 |
SQL_TYPE_UTCDATETIME | UTCDATETIME | Year、month、day、hour、minute、second、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] | 间隔小时(p) 到分钟 | 两个日期/时间之间的小时/分钟数; 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 中没有相应的数据类型。
本部分提供以下示例。