이 구조는 데이터베이스에 대한 연결을 한 개 처리하는 것을 나타낸다. 거의 모든 MySQL 함수들이 이것을 사용한다. MYSQL 구조에 대한 복사는 시도하지 말도록 한다. 복사본이 제대로 사용될 수 있을지는 보장할 수 없다.
이 구조는 열을 리턴하는 쿼리의 결과를 나타낸다 (SELECT, SHOW, DESCRIBE, EXPLAIN). 쿼리가 리턴하는 정보를 결과 셋 (result set)이라고 한다.
이것은 데이터의 하나의 열에 대한 타입-세이프 (type-safe) 표현 방식이다. 이것은 현재 바이트 스트링으로 카운팅된 어레이 방식으로 구현된다. (이와 같은 값의 내부에는 널 값이 들어 있을 수도 있기 때문에 필드 값에 바이너리 데이터가 들어 있다고 하더라도 이것을 널-터미네이티드 (null-terminated) 스트링으로 처리할 수 없다.) mysql_fetch_row()를 호출하면 열을 얻을 수가 있다.
이 구조는 필드 이름, 타입, 그리고 크기와 같은 필드 정보를 가지고 있다. mysql_fetch_field()를 반복적으로 호출하면 각 필드에 대한 MYSQL_FIELD 구조를 얻을 수 있다.
이것은 MySQL 필트 리스트에 들어 가는 오프셋에 대한 타입-세이프 표현 방식이다. (mysql_field_seek()가 사용함.) 오프셋은 0으로 시작하는 열 내부 필드 번호이다.
이 타입은 열 번호용 및 mysql_affected_rows(), mysql_num_rows(), 그리고 mysql_insert_id()용으로 사용된다. 이 타입은 0 ~ 1.84e19까지의 범위를 제공한다.
어떤 시스템에서는 my_ulonglong 값을 프린트하지 못할 수도 있다. 이러한 경우에는,
이것을 unsigned long으로 변화 시킨 후에 %lu 프린트 포맷을 사용하도록 한다:
printf ("Number of rows: %lu\n",
(unsigned long) mysql_num_rows(result));
논리 타입. 진실 (0이 아닌 값) 또는 거짓 (0).
MYSQL_FIELD 구조에는 아래와 같은 것들을 포함되어 있다:
- char * name
널-터미네이티드 스트링 형태의 필드 이름. 필드에 AS 구문이 들어 있는 별칭 (alias)을 사용한다면, name 값은 별칭이 된다.
- char * org_name
널-터미네이티드 스트링 형태의 필드 이름. 별칭은 무시된다.
- char * table
이 필드가 계산된 필드 (calculated field)가 아닐 경우 이것을 가지고 있는 테이블의 이름. 이것이 계산된 필드라면, table 값은 빈 스트링(empty string)이 된다. 뷰로 컬럼을 선택했다면, table 이름은 뷰가 된다. 테이블 또는 뷰가 AS 구문을 사용한 별칭이라면, table 값은 별칭이 된다.
- char * org_table
널-터미네이티드 스트링 형태의 테이블 이름. 별칭은 무시된다. 뷰를 통해서 컬럼을 선택했다면, org_table은 언더라잉 테이블 (underlying table) 이름이 된다.
- char * db
필드가 나오는 데이터베이스 이름이며, 널-터미네이티드 스트링 형태이다. 필드가 계산된 필드라면, db는 빈 스트링이 된다.
- char * catalog
카탈로그 이름. 이 값은 항상 "def"이다.
- char * def
이 필드의 디폴트 값이며, 널-테미네이티드 스트링 형태이다. 이것은 mysql_list_fields()를 사용하는 경우에만 설정한다.
- unsigned long length
필드의 폭 (width). 이것은 바이트 단위의 출력 길이 (display length)에 해당한다.
- unsigned long max_length
결과 셋에 대한 필드의 최대 폭 (결과 셋에 실제로 들어 있는 열 중의 최대 길이 필드 값에 해당하는 바이트 단위 길이). mysql_store_result() 또는 mysql_list_fields()를 사용한다면, 이것은 필드용 최대 길이를 가진다. mysql_use_result()를 사용한다면, 이 값은 0이 된다.
max_length 값은 결과 셋에 들어 있는 값의 스트링 표시 길이가 된다. 예를 들면, FLOAT 컬럼을 추출했을 때 “widest” 값이 -12.345라면, max_length는 7이 된다 ('-12.345'의 길이).
- 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
필드용 별도 비트-플래그 (bit-flag). flags 값은 0 또는 아래의 비트 셋 값보다 크다:
|
Flag Value |
Flag Description |
|
NOT_NULL_FLAG |
Field can't be NULL |
|
PRI_KEY_FLAG |
Field is part of a primary key |
|
UNIQUE_KEY_FLAG |
Field is part of a unique key |
|
MULTIPLE_KEY_FLAG |
Field is part of a non-unique key |
|
UNSIGNED_FLAG |
Field has the UNSIGNED attribute |
|
ZEROFILL_FLAG |
Field has the ZEROFILL attribute |
|
BINARY_FLAG |
Field has the BINARY attribute |
|
AUTO_INCREMENT_FLAG |
Field has the AUTO_INCREMENT attribute |
|
ENUM_FLAG |
Field is an ENUM (deprecated) |
|
SET_FLAG |
Field is a SET (deprecated) |
|
BLOB_FLAG |
Field is a BLOB or TEXT (deprecated) |
|
TIMESTAMP_FLAG |
Field is a TIMESTAMP (deprecated) |
BLOB_FLAG, ENUM_FLAG, SET_FLAG, 그리고 TIMESTAMP_FLAG 플래그는 더 이상 사용되지 않으며, MYSQL_TYPE_BLOB, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, 또는 MYSQL_TYPE_TIMESTAMP에 대해서는 field->type를 대신 사용한다.
아래의 예문은 flags 값을 사용하는 전형적인 방법을 보여 준다:
if (field->flags & NOT_NULL_FLAG)
printf("Field can't be null\n");
flags 값에 대한 논리 (boolean) 상태를 결정할 때에는 다음과 같은 매크로를 사용할 수도 있다:
|
Flag Status |
Description |
|
IS_NOT_NULL(flags) |
True if this field is defined as NOT NULL |
|
IS_PRI_KEY(flags) |
True if this field is a primary key |
|
IS_BLOB(flags) |
True if this field is a BLOB or TEXT (deprecated; test field->type instead) |
- unsigned int decimals
숫자 필드에 대한 10진수 숫자.
- unsigned int charsetnr
필드에 대한 문자 셋 번호.
- enum enum_field_types type
필드의 타입. type 값은 아래의 테이블에 나와 있는 MYSQL_TYPE_ 심볼 중의 하나가 된다:
|
Type Value |
Type Description |
|
MYSQL_TYPE_TINY |
TINYINT field |
|
MYSQL_TYPE_SHORT |
SMALLINT field |
|
MYSQL_TYPE_LONG |
INTEGER field |
|
MYSQL_TYPE_INT24 |
MEDIUMINT field |
|
MYSQL_TYPE_LONGLONG |
BIGINT field |
|
MYSQL_TYPE_DECIMAL |
DECIMAL or NUMERIC field |
|
MYSQL_TYPE_NEWDECIMAL |
Precision math DECIMAL or NUMERIC |
|
MYSQL_TYPE_FLOAT |
FLOAT field |
|
MYSQL_TYPE_DOUBLE |
DOUBLE or REAL field |
|
MYSQL_TYPE_BIT |
BIT field |
|
MYSQL_TYPE_TIMESTAMP |
TIMESTAMP field |
|
MYSQL_TYPE_DATE |
DATE field |
|
MYSQL_TYPE_TIME |
TIME field |
|
MYSQL_TYPE_DATETIME |
DATETIME field |
|
MYSQL_TYPE_YEAR |
YEAR field |
|
MYSQL_TYPE_STRING |
CHAR or BINARY field |
|
MYSQL_TYPE_VAR_STRING |
VARCHAR or VARBINARY field |
|
MYSQL_TYPE_BLOB |
BLOB or TEXT field (use max_length to determine the maximum length) |
|
MYSQL_TYPE_SET |
SET field |
|
MYSQL_TYPE_ENUM |
ENUM field |
|
MYSQL_TYPE_GEOMETRY |
Spatial field |
|
MYSQL_TYPE_NULL |
NULL-type field |
필드에 숫자 타입이 있는지를 테스트하는 것은 IS_NUM() 매크로를 사용하면 된다.
type 값을 IS_NUM()에 전달하면, 필드가 숫자일 경우에 TRUE가 나온다:
if (IS_NUM(field->type))
printf("Field is numeric\n");
스트링 데이터 타입에 대해서 바이너리와 비-바이너리 데이터를 구분하기 위해서는, charsetnr 값이 63인지 아닌지를 검사한다. 그 값이 63이라면, 문자 셋은 binary이다. 이것이 BINARY와 CHAR, VARBINARY와 VARCHAR, 그리고 BLOB와 TEXT를 구분하는 방법이다.