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,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 雙精確度 帶正負號、近似的數值,具有二進位有效位數 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] 應用程式會使用 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 中沒有對應的資料類型。

本節提供下列範例。