文件首頁
MySQL 8.4 C API 開發人員指南
下載本手冊
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL 8.4 C API 開發人員指南  /  C API 基本介面  /  C API 基本資料結構

5.2 C API 基本資料結構

本節說明 C API 中,除了用於預處理語句、非同步介面或複寫串流介面以外的資料結構。有關這些資訊,請參閱第 6.2 節「C API 預處理語句資料結構」第 7.2 節「C API 非同步介面資料結構」第 10.2 節「C API 二進位日誌資料結構」

  • MYSQL

    此結構代表一個資料庫連線的處理常式。幾乎所有 MySQL 函式都會用到它。請勿嘗試複製 MYSQL 結構。無法保證複製的結構可用。

  • MYSQL_RES

    此結構代表傳回列的查詢結果 (SELECTSHOWDESCRIBEEXPLAIN)。查詢傳回的資訊在本節的其餘部分稱為結果集

  • MYSQL_ROW

    這是一個資料列的類型安全表示法。目前實作為計數字元串陣列。(如果欄位值可能包含二進位資料,則您無法將這些值視為以 null 結尾的字串,因為這類值可能在內部包含 null 位元組。) 透過呼叫 mysql_fetch_row() 取得資料列。

  • MYSQL_FIELD

    此結構包含中繼資料:欄位的相關資訊,例如欄位的名稱、類型和大小。其成員將在本節稍後詳細說明。您可以透過重複呼叫 mysql_fetch_field() 取得每個欄位的 MYSQL_FIELD 結構。欄位值不屬於此結構;它們包含在 MYSQL_ROW 結構中。

  • MYSQL_FIELD_OFFSET

    這是一個 MySQL 欄位清單中位移的類型安全表示法。(由 mysql_field_seek() 使用。) 位移是資料列中的欄位編號,從零開始。

  • my_ulonglong

    用於 64 位元不帶正負號整數的類型。my_ulonglong 類型在 MySQL 8.0.18 之前使用。從 MySQL 8.0.18 開始,請改用 uint64_t C 類型。

  • my_bool

    布林值類型,用於真 (非零) 或假 (零) 值。my_bool 類型在 MySQL 8.0 之前使用。從 MySQL 8.0 開始,請改用 boolint C 類型。

    注意

    my_bool 變更為 bool 表示 mysql.h 標頭檔需要 C++ 或 C99 編譯器才能編譯。

MYSQL_FIELD 結構包含下列清單中所述的成員。這些定義主要適用於結果集的欄,例如由 SELECT 陳述式產生的欄。MYSQL_FIELD 結構也用於為使用預處理 CALL 陳述式執行的預存程序所傳回的 OUTINOUT 參數提供中繼資料。對於這類參數,某些結構成員的意義與欄位值的意義不同。

提示

若要以互動方式檢視結果集的 MYSQL_FIELD 成員值,請使用 --column-type-info 選項啟動 mysql 用戶端,然後執行一些範例查詢。

  • char * name

    欄位的名稱,為以 null 結尾的字串。如果欄位使用 AS 子句指定了別名,則 name 的值為別名。對於程序參數,則為參數名稱。

  • char * org_name

    欄位的名稱,為以 null 結尾的字串。別名會被忽略。對於運算式,此值為空字串。對於程序參數,則為參數名稱。

  • char * table

    包含此欄位的資料表名稱 (如果不是計算欄位)。對於計算欄位,table 值為空字串。如果從檢視表選取欄,則 table 會命名該檢視表。如果資料表或檢視表使用 AS 子句指定了別名,則 table 的值為別名。對於 UNION,此值為空字串。對於程序參數,則為程序名稱。

  • char * org_table

    資料表的名稱,為以 null 結尾的字串。別名會被忽略。如果從檢視表選取欄,則 org_table 會命名該檢視表。如果從衍生資料表選取欄,則 org_table 會命名基底資料表。如果衍生資料表包裝了檢視表,則 org_table 仍然會命名基底資料表。如果欄位是運算式,則 org_table 為空字串。對於 UNION,此值為空字串。對於程序參數,此值為程序名稱。

  • char * db

    欄位來自的資料庫名稱,為以 null 結尾的字串。如果欄位是計算欄位,則 db 為空字串。對於 UNION,此值為空字串。對於程序參數,則為包含程序的資料庫名稱。

  • char * catalog

    目錄名稱。此值永遠為 "def"

  • char * def

    此欄位的預設值,為以 null 結尾的字串。只有在使用 mysql_list_fields() 時才會設定此值。

  • unsigned long length

    欄位的寬度。這對應於顯示長度,以位元組為單位。

    伺服器會在產生結果集之前決定 length 值,因此這是資料類型所需要的最小長度,該資料類型能夠容納結果欄中可能的最大值,而無需預先知道查詢將為結果集產生的實際值。

    對於字串欄,length 值會根據連線字元集而變化。例如,如果字元集是 latin1(單位元組字元集),則 SELECT 'abc' 查詢的 length 值為 3。如果字元集是 utf8mb4(多位元組字元集,其中字元最多佔用 4 個位元組),則 length 值為 12。

  • unsigned long max_length

    結果集的欄位最大寬度(結果集中實際欄位值的最長欄位值的位元組長度)。如果您使用 mysql_store_result()mysql_list_fields(),則此值包含欄位的最大長度。如果您使用 mysql_use_result(),則此變數的值為零。

    max_length 的值是結果集中值的字串表示長度。例如,如果您檢索 FLOAT 欄,且「最寬」的值是 -12.345,則 max_length 為 7('-12.345' 的長度)。

    如果您正在使用預處理陳述式,則預設情況下不會設定 max_length,因為對於二進制協定,值的長度取決於結果集中值的類型。(請參閱第 6.2 節,「C API 預處理陳述式資料結構」。)如果您仍然需要 max_length 值,請使用 mysql_stmt_attr_set() 啟用 STMT_ATTR_UPDATE_MAX_LENGTH 選項,並且當您呼叫 mysql_stmt_store_result() 時,將會設定長度。(請參閱第 6.4.3 節,「mysql_stmt_attr_set()」,以及第 6.4.29 節,「mysql_stmt_store_result()」。)

  • unsigned int name_length

    name 的長度。

  • unsigned int org_name_length

    org_name 的長度。

  • unsigned int table_length

    table 的長度。

  • unsigned int org_table_length

    org_table 的長度。

  • unsigned int db_length

    db 的長度。

  • unsigned int catalog_length

    catalog 的長度。

  • unsigned int def_length

    def 的長度。

  • unsigned int flags

    描述欄位的位元旗標。flags 值可能設定了零個或多個以下表格中顯示的位元。

    旗標值 旗標描述
    NOT_NULL_FLAG 欄位不能為 NULL
    PRI_KEY_FLAG 欄位是主索引鍵的一部分
    UNIQUE_KEY_FLAG 欄位是唯一索引鍵的一部分
    MULTIPLE_KEY_FLAG 欄位是非唯一索引鍵的一部分
    UNSIGNED_FLAG 欄位具有 UNSIGNED 屬性
    ZEROFILL_FLAG 欄位具有 ZEROFILL 屬性
    BINARY_FLAG 欄位具有 BINARY 屬性
    AUTO_INCREMENT_FLAG 欄位具有 AUTO_INCREMENT 屬性
    ENUM_FLAG 欄位是 ENUM
    SET_FLAG 欄位是 SET
    BLOB_FLAG 欄位是 BLOBTEXT(已棄用)
    TIMESTAMP_FLAG 欄位是 TIMESTAMP(已棄用)
    NUM_FLAG 欄位是數值;請參閱表格後的其他注意事項
    NO_DEFAULT_VALUE_FLAG 欄位沒有預設值;請參閱表格後的其他注意事項

    其中一些旗標表示資料類型資訊,並由稍後描述的 field->type 成員中的 MYSQL_TYPE_xxx 值取代或與之結合使用

    • 若要檢查 BLOBTIMESTAMP 值,請檢查 type 是否為 MYSQL_TYPE_BLOBMYSQL_TYPE_TIMESTAMP。(BLOB_FLAGTIMESTAMP_FLAG 旗標是不需要的。)

    • ENUMSET 值會以字串形式傳回。對於這些值,請檢查 type 值是否為 MYSQL_TYPE_STRING,以及 flags 值中是否設定了 ENUM_FLAGSET_FLAG 旗標。

    NUM_FLAG 表示欄位是數值。這包括類型為 MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMALMYSQL_TYPE_TINYMYSQL_TYPE_SHORTMYSQL_TYPE_LONGMYSQL_TYPE_FLOATMYSQL_TYPE_DOUBLEMYSQL_TYPE_NULLMYSQL_TYPE_LONGLONGMYSQL_TYPE_INT24MYSQL_TYPE_YEAR 的欄位。

    NO_DEFAULT_VALUE_FLAG 表示欄位的定義中沒有 DEFAULT 子句。這不適用於 NULL 欄(因為此類欄的預設值為 NULL),或適用於 AUTO_INCREMENT 欄(其具有隱含的預設值)。

    以下範例說明 flags 值的典型用法

    if (field->flags & NOT_NULL_FLAG)
        printf("Field cannot be null\n");

    您可以使用下表中顯示的便利巨集來判斷 flags 值的布林狀態。

    旗標狀態 描述
    IS_NOT_NULL(flags) 如果此欄位定義為 NOT NULL,則為 True
    IS_PRI_KEY(flags) 如果此欄位是主索引鍵,則為 True
    IS_BLOB(flags) 如果此欄位是 BLOBTEXT,則為 True(已棄用;請改為測試 field->type
  • unsigned int decimals

    數值欄位的小數位數,以及時間欄位的秒數精度。

  • unsigned int charsetnr

    一個 ID 編號,表示欄位的字元集/校對配對。

    通常,結果集中的字元值會轉換為 character_set_results 系統變數所指示的字元集。在這種情況下,charsetnr 對應於該變數所指示的字元集。可以透過將 character_set_results 設定為 NULL 來取消字元集轉換。在這種情況下,charsetnr 對應於原始資料表欄或運算式的字元集。另請參閱連線字元集和校對

    若要區分字串資料類型的二進制和非二進制資料,請檢查 charsetnr 值是否為 63。如果是,則字元集為 binary,表示二進制而非非二進制資料。這讓您可以區分 BINARYCHARVARBINARYVARCHAR,以及 BLOB 類型與 TEXT 類型。

    charsetnr 值與 SHOW COLLATION 陳述式的 Id 欄或 INFORMATION_SCHEMA COLLATIONS 資料表的 ID 欄中顯示的值相同。您可以使用這些資訊來源來查看特定的 charsetnr 值表示哪個字元集和校對

    mysql> SHOW COLLATION WHERE Id = 63;
    +-----------+---------+----+---------+----------+---------+
    | Collation | Charset | Id | Default | Compiled | Sortlen |
    +-----------+---------+----+---------+----------+---------+
    | binary    | binary  | 63 | Yes     | Yes      |       1 |
    +-----------+---------+----+---------+----------+---------+
    
    mysql> SELECT COLLATION_NAME, CHARACTER_SET_NAME
           FROM INFORMATION_SCHEMA.COLLATIONS WHERE ID = 33;
    +-----------------+--------------------+
    | COLLATION_NAME  | CHARACTER_SET_NAME |
    +-----------------+--------------------+
    | utf8_general_ci | utf8               |
    +-----------------+--------------------+
  • enum enum_field_types type

    欄位的類型。type 值可以是下表中顯示的 MYSQL_TYPE_ 符號之一。

    類型值 類型描述
    MYSQL_TYPE_TINY TINYINT 欄位
    MYSQL_TYPE_SHORT SMALLINT 欄位
    MYSQL_TYPE_LONG INTEGER 欄位
    MYSQL_TYPE_INT24 MEDIUMINT 欄位
    MYSQL_TYPE_LONGLONG BIGINT 欄位
    MYSQL_TYPE_DECIMAL DECIMALNUMERIC 欄位
    MYSQL_TYPE_NEWDECIMAL 精確數學 DECIMALNUMERIC
    MYSQL_TYPE_FLOAT FLOAT 欄位
    MYSQL_TYPE_DOUBLE DOUBLEREAL 欄位
    MYSQL_TYPE_BIT BIT 欄位
    MYSQL_TYPE_TIMESTAMP TIMESTAMP 欄位
    MYSQL_TYPE_DATE DATE 欄位
    MYSQL_TYPE_TIME TIME 欄位
    MYSQL_TYPE_DATETIME DATETIME 欄位
    MYSQL_TYPE_YEAR YEAR 欄位
    MYSQL_TYPE_STRING CHARBINARY 欄位
    MYSQL_TYPE_VAR_STRING VARCHARVARBINARY 欄位
    MYSQL_TYPE_BLOB BLOBTEXT 欄位 (使用 max_length 來決定最大長度)
    MYSQL_TYPE_SET SET 欄位
    MYSQL_TYPE_ENUM ENUM 欄位
    MYSQL_TYPE_GEOMETRY 空間欄位
    MYSQL_TYPE_NULL NULL 型別欄位

    MYSQL_TYPE_TIME2MYSQL_TYPE_DATETIME2MYSQL_TYPE_TIMESTAMP2) 型別代碼僅在伺服器端使用。客戶端看到的是 MYSQL_TYPE_TIMEMYSQL_TYPE_DATETIMEMYSQL_TYPE_TIMESTAMP 代碼。

    您可以使用 IS_NUM() 巨集來測試欄位是否為數值型別。將 type 值傳遞給 IS_NUM(),如果該欄位是數值型別,則會評估為 TRUE。

    if (IS_NUM(field->type))
        printf("Field is numeric\n");

    ENUMSET 值會以字串形式傳回。對於這些值,請檢查 type 值是否為 MYSQL_TYPE_STRING,以及 flags 值中是否設定了 ENUM_FLAGSET_FLAG 旗標。