2011. 7. 11. 01:46

MYSQL

이 구조는 하나의 데이터베이스 커넥션을 다루는 방법을 나타낸다. 

이것은 대부분 모든MySQL 함수에 사용된다. 

사용자는 MYSQL 구조의 카피를 만들 필요가 없다. 이런 카피가 사용 가능하다는 보장이 없다.

 

MYSQL_RES

이 구조는 로우들을 리턴한 쿼리의 결과를 나타낸다 rows (SELECT, SHOW, DESCRIBE,EXPLAIN). 

쿼리에서 리턴된 정보는 이 장의 나머지에 result set 로 호출된다.

 

MYSQL_ROW

이것은 데이터의 열 하나의 타입에 따라 나타난다. 

이것은 일반적으로 계산되는 바이트 문자열(스트링)의 어레이로 실행된다.

(필드 값이 바이너리 데이터를 포함하고 있다면,이런 값들이 null 바이트를

내부적으로 포함하고 있기 때문에 사용자는 이것들을 null-terminated 문자열로 취급할 수 없다) 

mysql_fetch_row()함수를 호출하여 로우들을 얻는다.

 

MYSQL_FIELD

이 구조는 필드 이름, 타입 사이즈 등과 같은 필드 정보를 포함하고 있다. 

이 요소들이 여기에 자세히 기술되어 있다. 

사용자는 각 필드에서 mysql_fetch_field() 함수를 반복적으로 호출함으로써 MYSQL_FIELD 구조를 얻을 수 있다. 

필드 값들은 이 구조의 부분이 아니다; 그것들은 MYSQL_ROW 구조에 포함되어 있다

 

MYSQL_FIELD_OFFSET

이것은 MySQL 필드 리스트 안에 오프셋의 타입에 따라 나타난다.

(mysql_field_seek()함수가 사용됨) 오프셋들은 0(제로)에서 시작한 하나의 로우 내에서 필드의 요소이다.

 

my_ulonglong

로우의 숫자, mysql_affected_rows(), mysql_num_rows(),  mysql_insert_id()함수에 사용된 타입. 

이 타입은 부터 1.84e19까지의 범위를 제공한다.

   

몇몇 시스템에서 my_ulonglong 타입 값이 출력되지 않는 경우가 있다. 

이런 값을 출력하려면, unsigned long 으로 변경하고, %lu 프린트 포맷을 이용.

예:)

printf ("Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));

   

 

MYSQL_FIELD 구조는 여기 열거한 요소들을 포함하고 있다:

char * name

null-terminated 문자열로, 필드의 이름. 필드에 AS 절로 알리아스(alias)가 주어졌다면,name 값은 그 알리아스(alias)이다.

char * org_name

null-terminated 문자열로, 필드 이름. 알리아스들이 무시된다.

char * table

계산되지 않은 필드를 포함하는 테이블 이름. 계산된 필드의 경우, table 값은 빈 문자열이다. 

테이블에 AS 절로 알리아스가 주어졌다면, table 값은 그 알리아스이다.

char * org_table

null-terminated 문자열로, 테이블 이름. 알리아스들이 무시된다.

char * db

null-terminated 문자열로, 필드에서 온 데이터베이스의 이름. 필드가 계산된 필드라면,db 는 빈 문자열이다.

char * catalog

카다로그 이름. 이 값은 항상 "def"이다.  

char * def

null-terminated 문자열로, 이 필드의 디폴트 값. mysql_list_fields()을 사용하면, 이것이 설정된다.

unsigned long length

테이블 정의에서 지정된 필드의 너비

unsigned long max_length

결과 셋의 필드 최대 너비(실제 결과 세트에서 로우를 위한 가장 긴 필드 값의 길이). 

만약mysql_store_result() 또는 mysql_list_fields()을 사용한다면, 이것은 필드의 최대 길이를 포함하고 있다. 

만약 mysql_use_result() 함수를 사용한다면, 이 변수의 값은0(zero)이다.

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(zero) 또는 비트 세트에 따라 더 큰 값이 될 수 있다:

플래그(Flag) 값

플래그(Flag) 설명

NOT_NULL_FLAG

필드는 NULL 이 될 수 없다.

PRI_KEY_FLAG

필드는 주요 키의 일부이다.

UNIQUE_KEY_FLAG

필드는 싱글(unique)키의 일부이다.

MULTIPLE_KEY_FLAG

필드는non-unique 키의 일부이다.

UNSIGNED_FLAG

필드는UNSIGNED 속성을 가진다.

ZEROFILL_FLAG

필드는 ZEROFILL 속성을 가진다.

BINARY_FLAG

필드는 BINARY 속성을 가진다.

AUTO_INCREMENT_FLAG

필드는 AUTO_INCREMENT 속성을 가진다.

ENUM_FLAG

필드는ENUM (deprecated)이다.

SET_FLAG

필드는 SET (deprecated)이다.

BLOB_FLAG

필드는BLOB 또는 TEXT (deprecated)이다.

TIMESTAMP_FLAG

필드는 TIMESTAMP (deprecated)이다.

   

플래그들이 타입의 속성보다는 필드의 타입을 표시하기 때문에 

BLOB_FLAG,ENUM_FLAG, SET_FLAG, 그리고 TIMESTAMP_FLAG 플래그(flags) 이용은 무시된다.

   

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 값을 결정하기 위해 다음 편리한 매크로를 사용할 수 있다:

Flag 상태

설명

IS_NOT_NULL(flags)

필드가 NOT NULL로 정의된다면 참(true)

IS_PRI_KEY(flags)

이 필드가 주요 키라면 참(True)

IS_BLOB(flags)

이 필드가 BLOB 또는 TEXT (무시됨; 테스트 field->type 대신에)라면 참(true)

unsigned int decimals

숫자 필드에 십진수의 숫자.

unsigned int charsetnr

필드에서 캐릭터 셋 숫자.

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 5.0.3 그리고 그 이후 버전에서)

MYSQL_TYPE_FLOAT

FLOAT 필드

MYSQL_TYPE_DOUBLE

DOUBLE 또는 REAL 필드

MYSQL_TYPE_BIT

BIT 필드 (MySQL 5.0.3 그리고 그 이후 버전에서)

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_CHAR

무시됨; 대신에MYSQL_TYPE_TINY 를 사용하라

   

필드가 숫자타입을 가지고 있는지 테스트하기 위해  IS_NUM() 매크로를 사용할 수 있다.

type 값을IS_NUM()에 전달하라 그러면 필드가 숫자라면 참(TRUE)로 평가한다:

if (IS_NUM(field->type))

    printf("Field is numeric\n");

   

문자열 데이터 타입에서 바이너리 데이터와 non-바이너리 데이터를 비교하기 위해서charsetnr 값이 63인지 확인하라. 

만약 그렇다면, 캐릭터 셋은 non-바이너리 데이터보다 바이너리를 보여주는 binary이다. 

이것이 BINARY 와 CHAR, VARBINARY 와VARCHAR,  BLOB 와 TEXT를 구별하는 방법이다.

Posted by devanix