Datatypes

Informix 列數據類型有哪些?

  • April 6, 2021

我正在編寫一個查詢,我需要知道一列是否屬於“BLOB”類型的列。根據此文件 ,通常 41 是“BLOB”類型的列的數量。但是,當我查詢syscolumns表時,我看到儲存 BLOB 數據的列在我的情況下實際上具有 297 的值。上面連結的那個頁面甚至在其頁面上的任何地方都沒有數字“297”。我找到了另一個頁面,標題為“數據類型常量”,但在這裡,數字“297”甚至沒有出現在頁面上的任何地方。

文件的數據類型列表似乎不完整。Informix 中是否有(更多)完整的列類型列表?

coltype系統目錄表列中的值syscolumns主要在 Informix ESQL/C 標題中定義sqltypes.h。此標頭在整個 Informix 伺服器程式碼中使用。

列中的值coltype是低位中的 8 位(無符號)整數和高位中的各種標誌值的混合。特別是,當使用NOT NULL限定符定義列時,0x100會設置該位 — 對應於“添加 256”。還有其他你不太可能看到的標誌位。

另一個答案中顯示的值 4118(十進制)對應於 hex 0x1016;(16又名 22 十進制)對應於SQLROW0x1000(4096 十進制)位對應於#define SQLNAMED 0x1000 /* Named row type vs row type */. 該類型是(如另一個答案中所述)“命名行類型”。

考慮一個表:

CREATE TABLE bool_check
(
   b1      BOOLEAN NOT NULL,
   b2      BOOLEAN
);

sqltype列中的值為syscolumns

  • b1= 297 = 256 + 41
  • b2= 41

這些對應於SQLUDTFIXED(類型 41)。類型SQLBOOL被標記為’由 FE 使用*$$ front end $$, … 不是 BE 中真正的主要類型$$ back end, meaning database server $$*’。兩者collength都是1

標題的相關部分包括:

SQL 類型:

#define SQLCHAR         0
#define SQLSMINT        1
#define SQLINT          2
#define SQLFLOAT        3
#define SQLSMFLOAT      4
#define SQLDECIMAL      5
#define SQLSERIAL       6
#define SQLDATE         7
#define SQLMONEY        8
#define SQLNULL         9
#define SQLDTIME        10
#define SQLBYTES        11
#define SQLTEXT         12
#define SQLVCHAR        13
#define SQLINTERVAL     14
#define SQLNCHAR        15
#define SQLNVCHAR       16
#define SQLINT8         17
#define SQLSERIAL8      18
#define SQLSET          19
#define SQLMULTISET     20
#define SQLLIST         21
#define SQLROW          22
#define SQLCOLLECTION   23
#define SQLROWREF       24
/*
* Note: SQLXXX values from 25 through 39 are reserved to avoid collision
*       with reserved PTXXX values in that same range. See p_types_t.h
*
* REFSER8: create tab with ref: referenced serial 8 rsam counter
*      this is essentially a SERIAL8, but is an additional rsam counter
*      this type only lives in the system catalogs and when read from
*      disk is converted to SQLSERIAL8 with CD_REFSER8 set in ddcol_t 
*      ddc_flags we must distinguish from SERIAL8 to allow both 
*      counters in one tab
*
* SQLSTREAM: Is a synonym for SQLUDTFIXED used by CDR (Enterprise
*      Replication) code
*/
#define SQLUDTVAR       40
#define SQLUDTFIXED     41
#define SQLSTREAM       SQLUDTFIXED
#define SQLREFSER8      42

/* These types are used by FE, they are not real major types in BE */
#define SQLLVARCHAR     43
#define SQLSENDRECV     44
#define SQLBOOL         45
#define SQLIMPEXP       46
#define SQLIMPEXPBIN    47

/* This type is used by the UDR code to track default parameters,
  it is not a real major type in BE */
#define SQLUDRDEFAULT   48
#define SQLUNKNOWN      51     
#define SQLBIGINT       52
#define SQLBIGSERIAL    53
#define SQLMAXTYPES     54

#define SQLLABEL        SQLINT

標誌:

#define SQLNONULL       0x0100  /* disallow nulls       */
/* a bit to show that the value is from a host variable */
#define SQLHOST         0x0200  /* Value is from host var. */
#define SQLNETFLT       0x0400  /* float-to-decimal for networked backend */
#define SQLDISTINCT     0x0800  /* distinct bit         */
#define SQLNAMED        0x1000  /* Named row type vs row type */
#define SQLDLVARCHAR    0x2000  /* Distinct of lvarchar */
#define SQLDBOOLEAN     0x4000  /* Distinct of boolean */
#define SQLCLIENTCOLL   0x8000  /* Collection is processed on client */

/* we are overloading SQLDBOOLEAN for use with row types */
#define SQLVARROWTYPE   0x4000  /* varlen row type */

還有編號為 100 到 125 的“C-ISAM 類型”,名稱為CCHARTYPECDECIMALTYPE。他們在這裡不是直接關注的。標頭檔中有 524 行(至少在我查看的版本中)。其中,74 行是空白的,315 行包含程式碼,其餘行是純註釋行。AFAIK,這種SQLREFSER8類型是死產的;它在此文件之外不存在。

類型BLOB NOT NULLCLOB NOT NULL都被編碼coltype為 297(41 + 256 - 相同的 a BOOLEAN NOT NULL),或72 (與SQLUDTFIXEDfor相對)。固定長度數據是一個描述符,它提供有關or值實際儲存位置的所有詳細資訊。collength``1``BOOLEAN NOT NULL``BLOB``CLOB

引用自:https://dba.stackexchange.com/questions/289296