本節說明 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_tC 型別。 -
布林型別,用於表示 true (非零) 或 false (零) 的值。
my_bool型別在 MySQL 8.0 之前使用。從 MySQL 8.0 開始,請改用bool或intC 型別。注意從
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_lengthname的長度。 -
unsigned int org_name_lengthorg_name的長度。 -
unsigned int table_lengthtable的長度。 -
unsigned int org_table_lengthorg_table的長度。 -
unsigned int db_lengthdb的長度。 -
unsigned int catalog_lengthcatalog的長度。 -
unsigned int def_lengthdef的長度。 -
unsigned int flags描述欄位的位元旗標。
flags值可以設定以下表格中顯示的零個或多個位元。旗標值 旗標說明 NOT_NULL_FLAG欄位不能為 NULLPRI_KEY_FLAG欄位是主鍵的一部分 UNIQUE_KEY_FLAG欄位是唯一鍵的一部分 MULTIPLE_KEY_FLAG欄位是非唯一鍵的一部分 UNSIGNED_FLAG欄位具有 UNSIGNED屬性ZEROFILL_FLAG欄位具有 ZEROFILL屬性BINARY_FLAG欄位具有 BINARY屬性AUTO_INCREMENT_FLAG欄位具有 AUTO_INCREMENT屬性ENUM_FLAG欄位是 ENUMSET_FLAG欄位是 SETBLOB_FLAG欄位是 BLOB或TEXT(已棄用)TIMESTAMP_FLAG欄位是 TIMESTAMP(已棄用)NUM_FLAG欄位是數值;請參閱表格後面的其他注意事項 NO_DEFAULT_VALUE_FLAG欄位沒有預設值;請參閱表格後面的其他注意事項 其中一些旗標表示資料類型資訊,並由稍後描述的
field->type成員中的MYSQL_TYPE_值取代或與之結合使用xxxNUM_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_SCHEMACOLLATIONS表格的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_TINYTINYINT欄位MYSQL_TYPE_SHORTSMALLINT欄位MYSQL_TYPE_LONGINTEGER欄位MYSQL_TYPE_INT24MEDIUMINT欄位MYSQL_TYPE_LONGLONGBIGINT欄位MYSQL_TYPE_DECIMALDECIMAL或NUMERIC欄位MYSQL_TYPE_NEWDECIMAL精確數學 DECIMAL或NUMERICMYSQL_TYPE_FLOATFLOAT欄位MYSQL_TYPE_DOUBLEDOUBLE或REAL欄位MYSQL_TYPE_BITBIT欄位MYSQL_TYPE_TIMESTAMPTIMESTAMP欄位MYSQL_TYPE_DATEDATE欄位MYSQL_TYPE_TIMETIME欄位MYSQL_TYPE_DATETIMEDATETIME欄位MYSQL_TYPE_YEARYEAR欄位MYSQL_TYPE_STRINGCHAR或BINARY欄位MYSQL_TYPE_VAR_STRINGVARCHAR或VARBINARY欄位MYSQL_TYPE_BLOBBLOB或TEXT欄位(使用max_length來判斷最大長度)MYSQL_TYPE_SETSET欄位MYSQL_TYPE_ENUMENUM欄位MYSQL_TYPE_GEOMETRY空間欄位 MYSQL_TYPE_NULLNULL類型欄位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旗標。