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 | 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] 應用程式會使用 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 中沒有對應的數據類型。
本節提供下列範例。