本節說明 C API 中,除了用於預處理語句、非同步介面或複寫串流介面以外的資料結構。有關這些資訊,請參閱第 6.2 節「C API 預處理語句資料結構」、第 7.2 節「C API 非同步介面資料結構」和第 10.2 節「C API 二進位日誌資料結構」。
-
此結構代表一個資料庫連線的處理常式。幾乎所有 MySQL 函式都會用到它。請勿嘗試複製
MYSQL
結構。無法保證複製的結構可用。 -
此結構代表傳回列的查詢結果 (
SELECT
、SHOW
、DESCRIBE
、EXPLAIN
)。查詢傳回的資訊在本節的其餘部分稱為結果集。 -
這是一個資料列的類型安全表示法。目前實作為計數字元串陣列。(如果欄位值可能包含二進位資料,則您無法將這些值視為以 null 結尾的字串,因為這類值可能在內部包含 null 位元組。) 透過呼叫
mysql_fetch_row()
取得資料列。 -
此結構包含中繼資料:欄位的相關資訊,例如欄位的名稱、類型和大小。其成員將在本節稍後詳細說明。您可以透過重複呼叫
mysql_fetch_field()
取得每個欄位的MYSQL_FIELD
結構。欄位值不屬於此結構;它們包含在MYSQL_ROW
結構中。 -
這是一個 MySQL 欄位清單中位移的類型安全表示法。(由
mysql_field_seek()
使用。) 位移是資料列中的欄位編號,從零開始。 -
用於 64 位元不帶正負號整數的類型。
my_ulonglong
類型在 MySQL 8.0.18 之前使用。從 MySQL 8.0.18 開始,請改用uint64_t
C 類型。 -
布林值類型,用於真 (非零) 或假 (零) 值。
my_bool
類型在 MySQL 8.0 之前使用。從 MySQL 8.0 開始,請改用bool
或int
C 類型。注意從
my_bool
變更為bool
表示mysql.h
標頭檔需要 C++ 或 C99 編譯器才能編譯。
MYSQL_FIELD
結構包含下列清單中所述的成員。這些定義主要適用於結果集的欄,例如由 SELECT
陳述式產生的欄。MYSQL_FIELD
結構也用於為使用預處理 CALL
陳述式執行的預存程序所傳回的 OUT
和 INOUT
參數提供中繼資料。對於這類參數,某些結構成員的意義與欄位值的意義不同。
若要以互動方式檢視結果集的 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
欄位是 BLOB
或TEXT
(已棄用)TIMESTAMP_FLAG
欄位是 TIMESTAMP
(已棄用)NUM_FLAG
欄位是數值;請參閱表格後的其他注意事項 NO_DEFAULT_VALUE_FLAG
欄位沒有預設值;請參閱表格後的其他注意事項 其中一些旗標表示資料類型資訊,並由稍後描述的
field->type
成員中的MYSQL_TYPE_
值取代或與之結合使用xxx
NUM_FLAG
表示欄位是數值。這包括類型為MYSQL_TYPE_DECIMAL
、MYSQL_TYPE_NEWDECIMAL
、MYSQL_TYPE_TINY
、MYSQL_TYPE_SHORT
、MYSQL_TYPE_LONG
、MYSQL_TYPE_FLOAT
、MYSQL_TYPE_DOUBLE
、MYSQL_TYPE_NULL
、MYSQL_TYPE_LONGLONG
、MYSQL_TYPE_INT24
和MYSQL_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
值的布林狀態。 -
unsigned int decimals
數值欄位的小數位數,以及時間欄位的秒數精度。
-
unsigned int charsetnr
一個 ID 編號,表示欄位的字元集/校對配對。
通常,結果集中的字元值會轉換為
character_set_results
系統變數所指示的字元集。在這種情況下,charsetnr
對應於該變數所指示的字元集。可以透過將character_set_results
設定為NULL
來取消字元集轉換。在這種情況下,charsetnr
對應於原始資料表欄或運算式的字元集。另請參閱連線字元集和校對。若要區分字串資料類型的二進制和非二進制資料,請檢查
charsetnr
值是否為 63。如果是,則字元集為binary
,表示二進制而非非二進制資料。這讓您可以區分BINARY
與CHAR
、VARBINARY
與VARCHAR
,以及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
DECIMAL
或NUMERIC
欄位MYSQL_TYPE_NEWDECIMAL
精確數學 DECIMAL
或NUMERIC
MYSQL_TYPE_FLOAT
FLOAT
欄位MYSQL_TYPE_DOUBLE
DOUBLE
或REAL
欄位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
CHAR
或BINARY
欄位MYSQL_TYPE_VAR_STRING
VARCHAR
或VARBINARY
欄位MYSQL_TYPE_BLOB
BLOB
或TEXT
欄位 (使用max_length
來決定最大長度)MYSQL_TYPE_SET
SET
欄位MYSQL_TYPE_ENUM
ENUM
欄位MYSQL_TYPE_GEOMETRY
空間欄位 MYSQL_TYPE_NULL
NULL
型別欄位MYSQL_TYPE_TIME2
、MYSQL_TYPE_DATETIME2
和MYSQL_TYPE_TIMESTAMP2
) 型別代碼僅在伺服器端使用。客戶端看到的是MYSQL_TYPE_TIME
、MYSQL_TYPE_DATETIME
和MYSQL_TYPE_TIMESTAMP
代碼。您可以使用
IS_NUM()
巨集來測試欄位是否為數值型別。將type
值傳遞給IS_NUM()
,如果該欄位是數值型別,則會評估為 TRUE。if (IS_NUM(field->type)) printf("Field is numeric\n");
ENUM
和SET
值會以字串形式傳回。對於這些值,請檢查type
值是否為MYSQL_TYPE_STRING
,以及flags
值中是否設定了ENUM_FLAG
或SET_FLAG
旗標。