23.8.5 C API Data 구조
이 섹션에서는 준비된 문에 사용되는 것 이외의 C API 데이터 구조에 대해 설명합니다. 후자에 대한 자세한 내용은 섹션 23.8.9 "C API 준비된 문 데이터 구조" 를 참조하십시오.
MYSQL이 구조는 하나의 데이터베이스 연결 핸들을 나타냅니다. 그것은 거의 모든 MySQL 함수에 사용됩니다.
MYSQL구조의 사본을 만들려고하지 마십시오. 그와 같은 자료를 사용할 수 보장 할 수 없습니다.MYSQL_RES이 구조는 행 (
SELECT,SHOW,DESCRIBE,EXPLAIN)을 반환하는 쿼리의 결과를 나타냅니다. 쿼리에서 반환되는 정보는이 섹션의 나머지 부분에서 결과 세트라고합니다.MYSQL_ROW이것은 1 행의 데이터 형식이 안전한 표현입니다. 그것은 현재 계산되는 바이트 문자열의 배열로 구현되어 있습니다. (필드 값에 바이너리 데이터가 포함되어있을 가능성이있는 경우, 내부에서 그 값에 NULL 바이트가 저장 될 가능성이 있기 때문에 이들을 NULL로 끝나는 문자열로 취급 할 수 없습니다.) 라인
mysql_fetch_row()를 호출하여 가져옵니다.MYSQL_FIELD이 구조는 메타 데이터 (필드의 이름, 형태, 크기 등의 필드에 대한 정보)가 저장됩니다. 회원 정보는이 섹션의 나머지 분에 자세히 설명되어 있습니다.
mysql_fetch_field()를 반복 호출하여 각 필드에 대한MYSQL_FIELD구조를 얻을 수 있습니다. 필드 값은이 구조에 포함되지 않습니다. 그들은MYSQL_ROW구조에 포함됩니다.MYSQL_FIELD_OFFSET이것은 MySQL 필드 목록에 오프셋 타입 세이프 표현입니다. (
mysql_field_seek()에서 사용됩니다.) 오프셋은 은행의 제로로부터 시작 필드 번호입니다.my_ulonglong행수와
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));my_booltrue (제로 이외) 또는 false (제로)의 값 boolean.
MYSQL_FIELD 구조는 다음 목록에 설명하는 멤버가 포함됩니다. 이 정의는 SELECT 문에 의해 생성되는 등 주로 결과 세트의 컬럼에 적용합니다. MySQL 5.6에서 MYSQL_FIELD 구조는 준비된 CALL 문을 사용하여 실행 된 저장 프로 시저에서 반환 된 OUT 및 INOUT 매개 변수의 메타 데이터를 제공하는 데 사용됩니다. 이러한 매개 변수는 구조 멤버 중 일부는 컬럼 값의 의미와 다른 의미를 갖습니다.
char * nameNULL로 끝나는 문자열로 필드의 이름입니다. 필드에
AS절로 별칭이 부여 된 경우,name값은 별칭입니다. 프로 시저 매개 변수의 경우, 매개 변수 이름.char * org_nameNULL로 끝나는 문자열로 필드의 이름입니다. 별칭은 무시됩니다. 식의 경우, 값은 빈 문자열입니다. 프로 시저 매개 변수의 경우, 매개 변수 이름.
char * table이 필드가 계산되는 필드가 아닌 경우, 그것을 저장하는 테이블의 이름입니다. 계산 필드의 경우,
table값은 빈 문자열입니다. 열이보기에서 선택되는 경우,table은 그 뷰를 지정합니다. 테이블 또는 뷰에AS절에서 별명이 부여 된 경우table값은 별칭입니다.UNION의 경우, 값은 빈 문자열입니다. 프로 시저 매개 변수의 경우 프로 시저 이름.char * org_tableNULL로 끝나는 문자열로 테이블의 이름. 별칭은 무시됩니다. 열이보기에서 선택되는 경우
org_table는 뷰를 지정합니다.UNION의 경우, 값은 빈 문자열입니다. 프로 시저 매개 변수의 경우 프로 시저 이름.char * dbNULL로 끝나는 문자열로 필드를 가져올 데이터베이스의 이름. 필드가 계산 필드이면
db는 빈 문자열입니다.UNION의 경우, 값은 빈 문자열입니다. 프로 시저 매개 변수의 경우 프로 시저를 포함하는 데이터베이스의 이름입니다.char * catalog카탈로그 명. 이 값은 항상
"def"입니다.char * defNULL로 끝나는 문자열로이 필드의 기본값. 이것은
mysql_list_fields()를 사용하는 경우에만 설정합니다.unsigned long length필드의 폭. 이것은 바이트 단위로 표시 길이에 대응합니다.
서버는 결과 세트를 생성하기 전에
length값을 결정하기 위해이 결과 집합에 대한 쿼리에 의해 생성되는 실제 값을 미리 알 수없고, 결과 열 수있는 최대 값을 저장할 수있는, 데이터 형에 필요한 최소 길이입니다.unsigned long max_length결과 세트의 필드의 최대폭 (결과 세트에있는 실제 행의 최대 길이 필드 값의 바이트 단위 길이).
mysql_store_result()또는mysql_list_fields()를 사용하는 경우 여기에는 필드의 최대 길이가 포함됩니다.mysql_use_result()를 사용하는 경우이 변수 값은 0입니다.max_length값은 결과 집합의 값의 문자열 표현의 길이입니다. 예를 들어,FLOAT컬럼을 검색하고 '최대 폭 "값이-12.345인 경우max_length7 ('-12.345'의 길이)입니다.준비된 문을 사용하는 경우 바이너리 프로토콜에서는 값의 길이가 결과 집합의 값의 형태에 따라서 다르기 때문에
max_length는 기본적으로 설정되지 않습니다. ( 섹션 23.8.9 "C API 준비된 문 데이터 구조" 를 참조하십시오.) 어쨌든max_length값이 필요한 경우mysql_stmt_attr_set()에서STMT_ATTR_UPDATE_MAX_LENGTH옵션을 사용하면mysql_stmt_store_result()를 호출 할 때 그 길이 이 설정됩니다. ( 섹션 23.8.11.3 "mysql_stmt_attr_set ()" 및 섹션 23.8.11.28 "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필드는 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_값으로 대체하거나 함께 사용됩니다.xxxBLOB또는TIMESTAMP값을 확인하려면type이MYSQL_TYPE_BLOB인지, 또는MYSQL_TYPE_TIMESTAMP인지 확인합니다. (BLOB_FLAG및TIMESTAMP_FLAG플래그는 필요 없습니다.)ENUM및SET값은 문자열로 반환됩니다. 이러한 내용은type값이MYSQL_TYPE_STRING에서flags값에ENUM_FLAG또는SET_FLAG플래그가 설정되어 있는지 확인합니다.
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값 boolean 상태를 확인할 수 있습니다.플래그의 상태 설명 IS_NOT_NULL(flags)이 필드가 NOT NULL로 정의되어있는 경우는 trueIS_PRI_KEY(flags)이 필드가 기본 키인 경우는 true IS_BLOB(flags)이 필드가 BLOB또는TEXT(비추천 대신에field->type을 테스트합니다)의 경우는 trueunsigned int decimals숫자 필드의 소수점 이하 자릿수 및 (MySQL 5.6.4 이후) 시간 필드의 소수 초 정밀도.
unsigned int charsetnr필드의 문자 집합 / 정렬 순서 쌍을 나타내는 ID 번호.
일반적으로 결과 세트의 문자 값은
character_set_results시스템 변수에 표시된 문자 세트로 변환됩니다. 이 경우charsetnr는 그 변수에 표시된 문자 집합을 지원합니다. 문자 집합 변환은character_set_results를NULL로 설정하여 지원할 수 있습니다. 이 경우charsetnr는 원래 테이블 컬럼 또는 표현식의 문자 집합을 지원합니다. 섹션 10.1.4 "연결 문자 집합 및 정렬 순서" 를 참조하십시오.문자열 데이터 형식의 바이너리 및 비 바이너리 데이터를 구분하려면
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플래그가 설정되어 있는지 확인합니다.