共用方式為


SQL 資料類型

每個 DBMS 都會定義自己的 SQL 類型。 每個 ODBC 驅動程式只會公開相關聯的 DBMS 所定義的 SQL 資料類型。 驅動程式如何將 DBMS SQL 類型對應至 ODBC 定義的 SQL 類型識別碼,以及驅動程式如何透過呼叫 SQLGetTypeInfo 將 DBMS SQL 類型對應至自己的驅動程式特定 SQL 類型識別符的相關信息。 當透過呼叫 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(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,unsigned: 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(帶正負號: -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] 日期 年、月和日欄位,符合公曆的規則。 (請參閱 本附錄稍後的公曆條件約束。
SQL_TYPE_TIME[6] TIME(p 小時、分鐘和第二個字段,有效值為 00 到 23 小時、00 到 59 分鐘的有效值,以及 00 到 61 秒的有效值。 Precision p 表示秒數有效位數。
SQL_TYPE_TIMESTAMP[6] TIMESTAMP(p Year、month、day、hour、minute 和 second 字段,其有效值如 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] 間隔年(p 兩個日期之間的年數; p 是間隔前置精確度。
SQL_INTERVAL_YEAR_TO_MONTH[7] INTERVAL YEAR(p) TO MONTH 兩個日期之間的年和月數; p 是間隔前置精確度。
SQL_INTERVAL_DAY[7] 間隔日(p 兩個日期之間的天數; p 是間隔前置精確度。
SQL_INTERVAL_HOUR[7] INTERVAL HOUR(p 兩個日期/時間之間的時數; p 是間隔前置精確度。
SQL_INTERVAL_MINUTE[7] 間隔分鐘(p 兩個日期/時間之間的分鐘數; p 是間隔前置精確度。
SQL_INTERVAL_SECOND[7] INTERVAL SECOND(p,q 兩個日期/時間之間的秒數; p 是間隔前置有效位數, q 是間隔秒有效位數。
SQL_INTERVAL_DAY_TO_HOUR[7] 間隔日(p) 到小時 兩個日期/時間之間的天數/小時數; p 是間隔前置精確度。
SQL_INTERVAL_DAY_TO_MINUTE[7] 間隔日(p) 到分鐘 兩個日期/時間之間的天數/小時/分鐘數; p 是間隔前置精確度。
SQL_INTERVAL_DAY_TO_SECOND[7] 間隔日(p) 至第二(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(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 中沒有對應的數據類型。

本節提供下列範例。