2011. 10. 8. 02:41

<stdlib.h>

int rand ( void );

void srand ( unsigned int seed );

 

#define RAND_MAX 2147483647 (32bit 리눅스 시스템 기준)

리턴값

rand : 0부터 RAND_MAX 사이의 의사 난수를 생성 반환.

설명

rand()는 0부터 RAND_MAX 사이의 난수를 생성하지만,

문제는 프로그램을 새로 실행할 때 마다 매번 다른 난수를 만들어 내지 않고

계속 같은 난수를 반복합니다.

그래서 srand()를 사용하여 의사 난수를 생성하기 위해서 난수의 생성 초기값인

seed값을 지정합니다. (보통 seed는 srand((unsigned) time(NULL))로 설정)

 

srand()가 호출되기 전에 rand()가 호출되면 디폴트 값은 1이 됩니다.

 

보통 seed는 srand((unsigned) time(NULL))로 지정하지만 time()는 초 단위이기 때문에

1초 이내에 여러 번 실행하게 되면 같은 난수가 중복되기 때문에 getpid()와 함께

사용합니다. getpid()는 같은 프로그램을 실행해도 매번 실행할 때 마다

프로세스 아이디가 계속 증가되기 때문에 매번 다른 값을 반환하게 됩니다.

이런 이유로 time()같이 사용합니다.

 

예 : srand( (unsigned)time(NULL)+(unsigned)getpid() );

 

 

[ rand의 난수 생성범위에 따른 함수 사용 방법: ]

난수 생성범위

프로그램 연산식

설명

1 <= 정수난수 <= 45

rand() % 45+1;

45로 나눈 나머지 값의 범위는 0~44,

이 값에 1을 더하므로 1~5 사이의 난수 생성

0 <= 정수난수 <= 99

rand() % 100;

100으로 나눈 나머지 값의 범위는 0~99이므로

0~99 사이의 난수 생성.

10 <= 정수난수 <= 30

rand() % 21 + 10;

21로 나눈 나머지 값의 범위는 0~20,

이 값에 10을 더해주면 10~30 사이의 난수 생성.

-5 <= 정수난수 <= 5

rand() % 11 - 5;

11로 나눈 나머지 값의 범위는 0~10,

이 값에 5를 감해주면 -5~+5 사이의 난수 생성.

0 <= 실수난수 <= 1

rand()/(double)RAND_MAX

0~RAND_MAX의 사이의 난수를 다시 (double)RAND_MAX로 형변환된 실수로

로 나눔으로써 0~1 사이의 실수 난수를 생성.

 

Example : lotto 번호 생성

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

sleep(3)  (0) 2011.02.12
strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix
2011. 7. 12. 22:02

Null로 종결된 문자열 query 에 의해 가리키는 SQL 명령문을 실행한다.

mysql_query() - SQL 쿼리 실행

형태

int mysql_query(MYSQL *mysql, const char *query)

리턴값

성공 : 0(zero)

에러 : Non-Zero.

 

length 바이트 길이의 문자열인 query에 의해 가리키는 SQL 쿼리를 실행한다. 

mysql_real_query() - SQL 쿼리 실행 (바이너리 데이터를 포함한 쿼리)

형태

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

리턴값

성공 : 0(zero)

에러 : Non-Zero.

 

▷ 일반적으로, 문자열은 하나의 싱글 SQL 명령문으로 구성된다.

그리고 사용자는 명령문에 종료 세미콜론 (';') 또는 \g를 명령문에 추가하지 말아야 한다. 

다중 명령문 실행이 가능했다면, 문자열은 세미콜론들로 구분된 여러 개의 명령문으로 구성될 수 있다.

 

mysql_query() 함수는 바이너리 데이터를 포함하는 쿼리들의 경우 사용될 수 없다.

바이너리 데이터에는 '\0' 문자가 포함될 수 있는데, mysql_query() 함수는 쿼리 문자열의 끝으로 해석될 수 있다.

바이너리 데이터를 포함한 쿼리의 경우 mysql_query() 함수보다 mysql_real_query() 함수를 사용. 

▷ 쿼리 문자열에서 strlen() 을 호출하지 않기 때문에, mysql_real_query() 함수가 mysql_query() 함수보다 더 빠름.

 

▷ 쿼리 명령문이 결과 셋을 리턴하는지 알고 싶다면, mysql_field_count()를 사용해서 검사하도록 한다.

 

 

[ 에러 ]

CR_COMMANDS_OUT_OF_SYNC

명령문이 불규칙한 순서로 실행됨

CR_SERVER_GONE_ERROR

MySQL 서버가 중단됨.

CR_SERVER_LOST

쿼리 동안 서버로의 연결이 끊김.

CR_UNKNOWN_ERROR

알 수 없는 에러 발생.

 

Posted by devanix
2011. 7. 12. 06:16

▷ 모든 API함수에 대한 오류는 에러 코드를 되돌려 줌으로서 나타나며,

세부 내용은 접속 처리 구조체를 통해 알려준다.

오류 메시지를 처리할 때 다음과 같인 두 개의 루틴만 알고 있으면 된다.

 

mysql_errno() - 가장 최근에 실행된 MySQL API 함수의 에러 코드를 리턴.

형태

unsigned int mysql_errno(MYSQL *mysql)

인수

mysql: MYSQL* 핸들

반환값

에러가 있을 경우: 마지막으로 호출된 API함수(mysql()_xxx)를 위한 에러 코드.

에러가 없을 경우: 0(zero)

 

mysql_error() - 가장 최근에 실행된 MySQL API 함수의 에러 메시지 문자열 리턴.

형태

const char *mysql_errno(MYSQL *mysql)

인수

mysql: MYSQL* 핸들

반환값

에러가 있을 경우: 마지막으로 호출된 API함수(mysql()_xxx)를 위한 에러 메시지 문자열.

에러가 없을 경우: 빈 문자열.

 

mysql_error()함수의 메시지는 내부의 정적 공간이므로,

오류 메시지를 저장하려면 메시지를 다른 위치에 복사하면 된다.

 

mysql_errno() 함수에 의해 리턴된 MySQL-지정 에러 숫자들은

mysql_sqlstate() 함수에 의해 리턴된 SQLSTATE 값과 다르다.

예를 들어, mysql 클라이언트 프로그램은 다음 포맷을 사용 중인 에러들을 보여준다.

여기서 1146 mysql_errno() 함수 값이고, '42S02' mysql_sqlstate() 함수 값과 일치한다:

shell> SELECT * FROM no_such_table;

ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist

 

 

주의:

mysql_fetch_row() 같은 몇몇 함수들은 성공하면 mysql_errno()를 설정하지 않음.

(경험적으로 서버에 정보를 요구하는 함수는, 성공했을 경우에 mysql_errno()를 재설정)

 

에러 메시지가 기술된 헤더 파일:

클라이언트 에러 메시지 숫자: MySQL errmsg.h 헤더 파일에 기술.

서버 에러 메시지 숫자 : mysqld_error.h 헤더 파일에 기술.

 

예제:

MYSQL mysql;

mysql_init(&mysql);

mysql_option(&mysql, MYSQL_READ_DEFAULT_GROUP, "your_prog_name");

if ( ! mysql_real_connect(&mysql, "host", "user", "passwd", "database", 0, NULL, 0)) {

■■■■fprintf(stderr, "Connection error %d: %s\n", mysql_errno(&mysql), mysql_error(&mysql));

}

 

Posted by devanix
2011. 7. 12. 02:59

mysql_options() - 별도 연결 옵션을 설정하는데 사용될 수 있으며, 연결 시 작동에 영향을 미칠 수 있다.

형태

int mysql_options(MYSQL *mysql, enum mysql_option option, const void *argument)

인수

mysql: MYSQL* 핸들

option: 사용자가 설정을 원하는 옵션

argument: 옵션 값. (옵션이 정수라면, 포인터로 가리킨다)

리턴값

성공: 0(Zero). 

실패: 알 수 없는 옵션을 사용하면, Non-zero.

 

mysql_init() 함수 후에 그리고 mysql_connect() 또는 mysql_real_connect()함수 전에 호출되어야 한다.

mysql_init();

mysql_options() ß mysql_init()와 mysql_connect() 사이에 필요한 횟수만큼 이 루틴을 호출 할 수 있다.

mysql_options()

mysql_connect();

   

▶ 일반적으로 자주 사용하는 옵션 몇 가지:

enum 옵션

변수 타입

기능

MYSQL_INIT_COMMAND

const char *

접속한 시간을 매 시간 보내는 명령

MYSQL_OPT_COMPRESS

None (use NULL)

압축된 클라이언트/서버 프로토콜을 사용.

MYSQL_OPT_CONNECT_TIMEOUT

unsigned int *

접속의 타임 아웃 시간(초 단위).

MYSQL_READ_DEFAULT_FILE

char *

my.cnf 로부터 대신에 네임드 옵션 파일에서 옵션을 읽음

MYSQL_READ_DEFAULT_GROUP

char *

my.cnf의 네임드 그룹 또는 MYSQL_READ_DEFAULT_FILE

로 지정한 파일에서 옵션을 읽음

▷ MYSQL_READ_DEFAULT_FILE 또는 MYSQL_READ_DEFAULT_GROUP 을 사용하면, 

client 그룹은 항상 읽힌다는 것을 명심하라.

 

▶ 옵션 파일에서 지정된 그룹은 다음 옵션들을 포함할 수 있다: 

옵션

설명

connect-timeout

수 초 내에 타임아웃 연결. 

리눅스에서 이 타임아웃은 서버로부터 처음 응답을 기다리는데 사용된다.

compress

간단한 클라이언트/서버 프로토콜을 사용.

database

연결 명령문에 데이터베이스가 지정되어 있지 않았다면, 

이 데이터베이스로 연결.

debug

디버그 옵션.

disable-local-infile

LOAD DATA LOCAL사용이 불가능

host

디폴트 호스트이름.

init-command

MySQL 서버로 연결 시 실행하기 위한 명령. 재연결 시 자동으로재실행됨.

interactive-timeout

CLIENT_INTERACTIVE 를 mysql_real_connect()함수에 

지정하는 것과 같다.  22.2.3.51, "mysql_real_connect()"장 참조

local-infile[=(0|1)]

변수가 없거나 변수가 != 0 라면, LOAD DATA LOCAL사용이 가능하다.

max_allowed_packet

패킷 클라이언트 최대 사이즈는 서버로부터 읽을 수 있다.

multi-results

다중 명령문 실행 또는 스토어드 프로시져로부터 멀티 결과 셋허용.

multi-statements

클라이언트가 싱글 문자열(스트링/.';'로 나누어진) 

내에 다중 명령문을 보내도록 허용.

password

디폴트 패스워드.

pipe

NT 기반에서 MySQL 서버에 연결하기 위해 명명된 파이프 사용.

protocol={TCP|SOCKET|PIPE|MEMORY}

서버로 연결 시 사용하는 프로토콜.

port

디폴트 포트 넘버.

return-found-rows

UPDATE 사용시, 업데이트된 로우들 대신에 검색된 로우들을

리턴하기 위해 mysql_info()함수를 호출.

shared-memory-base-name=name

서버로 연결하기 위해 사용되는 공유 메머리 이름(디폴트는"MYSQL").

socket

디폴트 소켓 파일.

user

디폴트 사용자.

   

 

[ 예제 ]

MYSQL mysql;

unsigned int timeout = 7;

 …

mysql_init(&mysql);

mysql_options(&mysql, MYSQL_OPT_COMPRESS, 0);

mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "odbc");

mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);

if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))

{

    fprintf(stderr, "Failed to connect to database: Error: %s\n",

          mysql_error(&mysql));

} 

이 코드는 클라이언트가 압축된 클라이언트/서버 프로토콜을 사용(MYSQL_OPT_COMPRESS).

my.cnf 파일 내에서 odbc 섹션으로부터 추가적인 옵션을 읽도록 요청(MYSQL_READ_DEFAULT_GROUP).

접속 시간 초과를 7초로 설정(MYSQL_OPT_CONNECT_TIMEOUT).

 

(※ 자세한 내용은 매뉴얼 페이지 참조)

Posted by devanix
2011. 7. 11. 20:11

mysql_real_connect() - Mysql 데이터베이스 엔진으로 연결 시도.

형태 & 인수

MYSQL *mysql_real_connect(

MYSQL *mysql,           /* MYSQL 구조의 어드레스 */

const char *host,        /* 호스트 이름 또는 IP 어드레스 (default = localhost) */

const char *user,       /* MySQL Login ID (default = 현재 로그인 이름) */

const char *passwd, /* 패스워드 (default = none) */

const char *db,           /* 데이터베이스 이름 (default = none) */

unsigned int port,      /* TCP/IP 연결 포트 (use default) */

const char *unix_socket,       /* 소켓 (use default) */

unsigned long client_flag)                /* flag (none) */

리턴 값

성공 : MYSQL* 연결 핸들 (= 첫 번째 파라미터)

실패 : NULL

사용자가 유효한 MYSQL 연결 핸들 구조를 요구하는 다른 어떤 API 함수를 

실행할 수 있기 전에 성공적으로 완료되어야 한다.

 

 

client_flag 값은 대체로 0이다. 그러나 정확한 기능을 작동하기 위해 다음 플래그의 조합으로 설정될 수 있다:

플래그(Flag) 이름

플래그(Flag) 설명

CLIENT_COMPRESS

압축 프로토콜 사용.

CLIENT_FOUND_ROWS

변경된 로우의 숫자가 아니라 찾은(맞는) 로우들의 숫자를 리턴.

CLIENT_IGNORE_SPACE

함수 이름 후에 공간 허용. 모든 함수 이름을 예비의 단어로 만듦.

CLIENT_INTERACTIVE

interactive_timeout 초 허용 (wait_timeout 초대신에)

of inactivity before closing the connection. 

클라이언트 세션 wait_timeout 변수는 세션

 interactive_timeout 변수 값으로 설정.

CLIENT_LOCAL_FILES

LOAD DATA LOCAL 조정 가능.

CLIENT_MULTI_STATEMENTS

싱글 문자열 (';'로 나눠진)에서 클라이언트가 다중(멀티) 명령문을 

보내도록 서버에 전달. 만약 이 플래그가 설정되어 있지 않다면, 

멀티-명령문 실행은 불가능하다.

CLIENT_MULTI_RESULTS

클라이언트가 멀티-명령문 실행 또는 스토어드 프로시저로부터 

멀티 결과 셋을 조정할 수 있다는 것을 서버에 전달. 

CLIENT_MULTI_STATEMENTS이 설정되어 있다면, 이것은 자동적으로 설정.

CLIENT_NO_SCHEMA

db_name.tbl_name.col_name 신텍스를 허용하지 않음. 이것은 ODBC용이다.

ODBC 프로그램에곤란한 버그에 사용하는 신텍스를 사용할 경우,

parser(쿼리문 분석기)가 에러를 출력하도록 한다.

CLIENT_ODBC

원격 데이터베이스를 사용할 때 ODBC를 사용하고 있는지 확인할 수 있다.

CLIENT_SSL

SSL 사용. 이 옵션은 어플리케이션 프로그램으로 설정될 수 없다; 

이것은 내부적으로 클라이언트 라이브러리 내에 설정된다.

mysql_real_connect()함수를 호출하기 전에mysql_ssl_set()함수를 사용.

 

 

[ 에러 ]

CR_CONN_HOST_ERROR

MySQL 서버로의 연결 실패.

CR_CONNECTION_ERROR

로컬 MySQL 서버로의 연결 실패

CR_IPSOCK_ERROR

IP소켓 생성 실패.

CR_OUT_OF_MEMORY

메모리 부족.

CR_SOCKET_CREATE_ERROR

유닉스 소켓 생성 실패.

CR_UNKNOWN_HOST

호스트 이름 용 IP 어드레스 찾기 실패.

CR_NAMEDPIPEOPEN_ERROR

윈도우에서 명명된 파이프 생성 실패

CR_NAMEDPIPEWAIT_ERROR

윈도우에서 명명된 파이프 대기(wait for) 실패.

CR_NAMEDPIPESETSTATE_ERROR

윈도우에서 파이프 핸들러(조정자) 획득 실패

CR_SERVER_LOST

connect_timeout > 0 이고 서버에 연결하는데

connect_timeout 초 보다 오래 걸리면 또는 서버가

or init-command을 실행하는 동안 죽는다면 실패.

 

[ 예제 ]

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

#define def_host_name   NULL     /* host to connect to (default = localhost) */
#define def_user_name   "rick"      /* user name (default = your login name) "*/
#define def_password    "bar"        /* password (default = none) */
#define def_db_name     NULL      /* dtabases to use (default = none) */
#define def_port_num    0               /* use default port */
#define def_socket_name NULL  /* use default socket name */

MYSQL my_conn;                    /* pointer to connection handler */

int main(int argc, char *argv[]) {

    mysql_init(&my_conn);
    if ( mysql_real_connect (
        &my_conn,                 /* pointer to connection handler */
        def_host_name,       /* host to connect to */
        def_user_name,       /* user name */
        def_password,          /* password */
        def_db_name,          /* database to use */
        def_port_num,          /* port (use default) */
        def_socket_name,   /* socket (use default) */
        0)                                 /* flags (none) */
    ) {
        printf("Connection success\n");
    } else {
        fprintf(stderr, "Failed to connect to databases: Error: %s\n",
            mysql_error(&my_conn));
    }

    mysql_close(&my_conn);
    return EXIT_SUCCESS;
}

   

 (※ 자세한 내용은 매뉴얼 페이지 참조)

Posted by devanix
2011. 7. 11. 05:58

mysql_config는 MySQL 클라이언트를 컴파일링하고

그것을 MySQL로 연결하는데 필요한 유용한 정보를 제공한다.

 

mysql_config 옵션:

옵션

설명

--cflags

찾는 컴파일러 프래그들은 파일과 핵심 컴파일러 플래그들을 포함하며,

libmysqlclient 라이브러리를 컴파일 할 때 사용된 정의한다.

--include

MySQL을 찾는 컴파일러 옵션은 파일을 포함한다.

(이 옵션 대신에 일반적으로 Note --cflags 을 사용한다는 것을 명심하라.)

--libs

MySQL 클라이언트 라이브러리로 링크하기 위해 요구되는 라이브러리들과 옵션들.

--libs_r

스레드에 안전한 MySQL 클라이언트 라이브러리로 링크하기 위해 요구되는 라이브러리와 옵션.

--plugindir

플러그인 디렉토리.

--socket

MySQL 설정 시 정의된 디폴트 유닉스 소켓 파일.

--port

MySQL 설정 시 정의된 디폴트 TCP/IP 포트 넘버.

--version

MySQL 버전 숫자.

--libmysqld-libs

MySQL 임베디드 서버로 링크하기 위해 요구되는 라이브러리들과 옵션들.

 

옵션없이 mysql_config 실행하면 지원하는 옵션과 그 값들의 리스트를 보여준다.

shell> mysql_config

Usage: /usr/bin/mysql_config [OPTIONS]

Options:

■■■--cflags■■■[-I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -DUNIV_LINUX -DUNIV_LINUX]

■■■--include■■[-I/usr/include/mysql]

■■■--libs■■■■[-Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient]

■■■--libs_r■■■[-Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient_r]

■■■--plugindir[/usr/lib/mysql/plugin]

■■■--socket■■[/var/run/mysqld/mysqld.sock]

■■■--port■■■■[0]

■■■--version■■[5.1.41]

■■■--libmysqld-libs[-Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqld -ldl -lwrap -lrt]

 

쉘 프롬프트 창에서 MySQL 클라이언트 프로그램 컴파일 예:

shell> CFG=/usr/local/mysql/bin/mysql_config

shell> sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"

이런 방법으로 mysql_config을 사용할 때, 백틱(backtick / '`'캐릭터 내에서 그것을 실행해야 한다. 

그것은 쉘(shell)이 그것을 실행하도록 명령하며, 그 아웃풋을 주변 명령문에 대신 넣는다.

 

make를 이용한 MySQL 클라이언트 프로그램 컴파일 예:

Makefile 작성

CC = gcc

CFLAGS = -Wall $(shell mysql_config --cflags)

LIBS = $(shell mysql_config --libs)

 

EXECUTABLES = myclient

■■■■all : $(EXECUTABLES)

 

myclient : myclient.c

■■■■$(CC) $(CFLAGS) $^ -o $@ $(LIBS)

Make의 $(shell 셸 명령어) 함수를 이용하면 shell 함수 뒤에 오는 셸 명령을 수행하고 결과를 리턴한다.

Posted by devanix
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
2011. 7. 10. 23:38

함수

설명

mysql_affected_rows()

마지막 UPDATE, DELETE, INSERT 쿼리에 의해 변경된 행의 수를 리턴.

mysql_autocommit()

자동수행(autocommit) 모드 on/off를 전환한다.

mysql_change_user()

공개된 커넥션에서 사용자와 데이터베이스 변경.

mysql_close()

서버 연결을 종료.

mysql_commit()

트랜잭션을 수행.

mysql_connect()

MySQL 서버를 연결.(이 함수는 무시됨; 대신 mysql_real_connect() 사용)

mysql_create_db()

데이터베이스를 생성.(이 함수는 무시됨; 대신에 SQL 문CREATE DATABASE 을 사용)

mysql_data_seek()

쿼리 결과 세트에서 임의의 로우 숫자를 찾는다.

mysql_debug()

주어진 문자열로 DBUG_PUSH 한다.

mysql_drop_db()

데이터베이스를 드롭.(이 함수는 무시됨; 대신에SQL문  DROP DATABASE 을 사용)

mysql_dump_debug_info()

서버가 로그에 디버그 정보를 쓰게 만든다.

mysql_eof()

결과 셋의 마지막 로우가 읽혀지는지 여부를 결정한다.

(이 기능은 무시된다; mysql_errno() 또는 mysql_error() 함수가 대신 사용)

mysql_errno()

가장 최근에 호출된 MySQL 함수의 에러 숫자를 리턴한다.

mysql_error()

가장 최근에 호출된 MySQL 함수의 에러 메시지를 리턴한다.

mysql_escape_string()

SQL 문에 사용하는 경우 문자열에서 스페셜 문자(캐릭터)를 중단한다.

mysql_fetch_field()

다음 테이블 필드의 타입을 리턴한다.

mysql_fetch_field_direct()

필드 숫자가 주어진 테이블 필드의 타입을 리턴한다.

mysql_fetch_fields()

모든 필드 구조의 배열을 리턴한다.

mysql_fetch_lengths()

현재 로우에서 모든 컬럼의 길이를 리턴한다.

mysql_fetch_row()

결과 셋에서 그 다음 로우를 호출한다.

mysql_field_seek()

컬럼 커서를 지정된 컬럼에 넣는다.

mysql_field_count()

가장 최근 명령문의 경우 결과 컬럼의 수를 리턴한다.

mysql_field_tell()

마지막 mysql_fetch_field()함수에 사용된 필드 커서의 포지션을 리턴.

mysql_free_result()

결과 셋이 사용한 메모리를 제거한다.

mysql_get_client_info()

문자열로써 클라이언트 버전 정보를 리턴한다.

mysql_get_client_version()

정수로써 클라이언트 버전 정보를 리턴한다.

mysql_get_host_info()

커넥션을 설명한 문자열을 리턴한다.

mysql_get_server_version()

정수로써 서버의 버전 숫자를 리턴한다.

mysql_get_proto_info()

연결에 사용된 프로토콜 버전을 리턴한다.

mysql_get_server_info()

서버 버전 숫자를 리턴한다.

mysql_info()

가장 최근에 실행된 쿼리에 관한 정보를 리턴한다.

mysql_init()

MYSQL 구조를 획득하거나 초기화하다.

mysql_insert_id()

AUTO_INCREMENT 컬럼에 이전 쿼리에 의해 발생한ID를 리턴한다.

mysql_kill()

주어진 쓰레드를 끄다(죽이다).

mysql_library_end()

MySQL C API 라이브러리는 끝내다.

mysql_library_init()

MySQL C API 라이브러리를 초기화하다.

mysql_list_dbs()

간단한 수식에 맞는 데이터베이스 이름을 리턴한다.

mysql_list_fields()

간단한 수식에 맞는 필드 이름을 리턴한다.

mysql_list_processes()

현재 서버 쓰레드의 목록을 리턴한다.

mysql_list_tables()

간단한 수식에 맞는 테이블 이름을 리턴한다.

mysql_more_results()

더 많은 결과가 있는지 체크한다.

mysql_next_result()

멀티-명령문 실행에서 그 다음 결과를 리턴한다/초기화한다.

mysql_num_fields()

결과 셋에서 컬럼의 숫자를 리턴한다.

mysql_num_rows()

결과 셋에서 로우의 숫자를 리턴한다.

mysql_options()

mysql_connect()함수의 경우 연결 옵션을 설정한다

mysql_ping()

필요에 따라 서버로의 연결이 되어 있는지 다시 연결해야 할지 체크한다.

mysql_query()

null로 종결된 문자열로 지정된 SQL 쿼리를 실행한다.

mysql_real_connect()

MySQL 서버로 연결한다.

mysql_real_escape_string()

현재 연결중인 캐릭터 셋을 고려하여 SQL 문에서 사용시 문자열에서 특수 문자를 중단.

mysql_real_query()

계산에 포함된 문자열로 지정된 SQL 쿼리를 실행한다.

mysql_refresh()

테이블과 캐시를 쏟아내거나(flush) 재설정한다.

mysql_reload()

서버가 grant 테이블을 다시 로드 하도록 전달한다.

mysql_rollback()

트랜잭션 롤백.

mysql_row_seek()

mysql_row_tell()함수로부터 리턴된 값을 사용하는 결과 셋에서 로우 오프셋을 찾음

mysql_row_tell()

로우 커서 위치를 리턴한다.

mysql_select_db()

데이터베이스를 선택한다.

mysql_server_end()

임베디드 서버 라이브러리를 종결한다.

mysql_server_init()

임베디드 서버 라이브러리를 초기화한다.

mysql_set_local_infile_default()

디폴트 값으로LOAD DATA LOCAL INFILE 조정기 콜백(callback)을 설정.

mysql_set_local_infile_handler()

어플리케이션을 위한LOAD DATA LOCAL INFILE 조정기 콜백을 인스톨함

mysql_set_server_option()

연결시 옵션을 설정한다(lmulti-statements처럼).

mysql_sqlstate()

최근 에러의 경우, SQLSTATE 에러코드를 리턴한다.

mysql_shutdown()

데이터베이스 서버를 셧다운한다.

mysql_stat()

문자열로 서버의 상태를 리턴한다.

mysql_store_result()

클라이언트로 완벽한 결과 셋을 검색한다.

mysql_thread_id()

현재 쓰레드 ID를 리턴한다.

mysql_thread_safe()

클라이언트가 쓰레드에 안전하게 컴파일 되었다면 1을 리턴한다.

mysql_use_result()

로우 별로 결과 셋 검색을 시작한다.

mysql_warning_count()

이전 SQL문의 경우 경고 카운트를 리턴한다.

   

[ 어플리케이션은 일반적인 아우트라인을 사용 ]

mysql_library_init()를 호출함으로써 MySQL 라이브러리를 초기화. 

(레귤러 클라이언트, 임베디드 서버 어플리케이션 구출할 때 사용)

mysql_init() 를 호출하여 연결 핸들러를 초기화하고 mysql_real_connect()를 호출하여 서버에 연결.

③ SQL 명령문을 실행.

mysql_close()함수를 호출하여 MySQL 서버로의 연결을 종료.

mysql_library_end()함수를 호출하여 MySQL 라이브러리의 사용을 종료.

 

mysql_library_init() 과 mysql_library_end() 함수의 호출 목적은 MySQL 라이브러리의 적당한 초기화와 최종화를 제공. 

클라이언트 라이브러리로 링크되는 어플리케이션의 경우, 향상된 메모리 매니지먼트를 제공한다. 

mysql_library_end()함수를 호출하지 않는다면, 메모리 블록은 할당된 채로 남는다.

(이것은 어플리케이션에 의해 사용된 메머리의 총량을 증가시키지 않지만 몇몇 메모리 리크 검전기가 그것에 대해 알려줄 것이다.) 

임베디드 서버로 링크되는 어플리케이션의 경우, 이런 호출들은 서버를 시작하고 종료한다.

   

mysql_library_init() 와 mysql_library_end() 함수는 MySQL 5.0.3 버전부터 적용된다. 

이것들은 실제로 mysql_server_init() 와 mysql_server_end()함수에 상응하는 #define 상징이다. 

그러나 어플리케이션이 mysqlclient 또는 mysqld 라이브러리를 사용하든 말든 간에 

MySQL 라이브러리의 사용을 시작하고 종료할 때 호출된다는 것을 이름들이 더 명확히 나타낸다.

MySQL 기존 버전의 경우, 대신에 mysql_server_init() 과 mysql_server_end() 함수를 호출할 수 있다.

   

non-멀티-쓰레드 환경에서, mysql_library_init() 로 호출은 생략된다.

mysql_init() 함수가 필요에 따라 그것을 불러오기 때문이다. 

그러나 멀티-쓰레드 환경에서 mysql_init() 함수가mysql_library_init() 함수를 불러온다면, 경쟁조건(race condition)이 가능하다

:mysql_library_init() 함수는 쓰레드에 안전하지 않아서 다른 클라이언트 라이브러리 호출보다 먼저 호출되어야 한다.

   

서버에 연결하기 위해서, 연결 조정기를 초기화하는 mysql_init() 함수를 호출하라. 

그리고 나서 그 조정기로 mysql_real_connect() 함수를 호출하라 

(호스트이름, 사용자이름, 패스워드와 같은 다른 정보를 함께). 

연결 상태에서mysql_real_connect() 함수는 reconnect 플래그(MYSQL 구조의 부분)를 5.0.3 이전 API의 버전에서는 1 로, 

또는 새로운 버전에서는 0 으로 값으로 설정한다. 이 플래그에서 값은 연결이 끊겨서 명령문이 실행되지 않는다면, 

포기하기 전에 서버로 다시 연결을 시도하려는 것을  나타낸다.

MySQL 5.0.3버전에서부터 재 연결 작동을 컨트롤하기 위해mysql_options() 함수로  MYSQL_OPT_RECONNECT 옵션을 사용할 수 있다. 

연결해서 작업을 마친 후, 그것을 종결하기 위해 mysql_close() 함수를 호출하라.

연결 중일 때, 클라이언트는 SQL문을 mysql_query() 또는 mysql_real_query(). 함수를 사용하는 서버로 전달한다.

mysql_query() 함수는 쿼리가 null-종결 문자열로 지정되기를 기대하는 반면,

mysql_real_query() 함수는 계산에 포함된 문자열을 기대한다는 것이 두 함수의 다른 점이다. 

만약 문자열이 바이너리 데이터(null 바이트를 포함한)를 포함하고 있다면, mysql_real_query()함수를 사용해야 하다.

   

각 non-SELECT 쿼리의 경우(예를 들어, INSERTUPDATEDELETE), mysql_affected_rows() 함수를 호출하여 얼마나 많은 로우들이 변경되었는지 알 수 있다.

   

SELECT 쿼리들의 경우, 사용자는 결과 세트로써 선택된 로우들을 검색한다. (몇몇 문은 로우들을 리턴하는 SELECT와 같다는 것을 명심하라. 이것은 SHOWDESCRIBE, 그리고 EXPLAIN를 포함하고 있다. 이것들은 SELECT 문과 같은 방식으로 처리된다.)

   

클라이언트가 결과 셋에 접근하는 2가지 방법이 있다. 하나는 mysql_store_result() 함수를 호출하여 한번에 전체 결과 세트를 검색하는 것이다. 이 함수는 쿼리가 리턴한 모든 로우들을 서버로부터 얻어 클라이언트에 그것을 저장한다. 두 번째 방법은 mysql_use_result() 함수를 호출하여 클라이언트가 로우별로 결과 세트 검색을 초기화하는 것이다. 이 함수는 검색을 초기화하지만 실제로 서버로부터 어떤 로우도 획득하지 못한다.

   

두 경우에서, mysql_fetch_row() 함수를 호출함으로써 로우에 접근할 수 있다.mysql_store_result() 함수를 가지고, mysql_fetch_row() 함수는 서버에서 이전에 명령을 꺼낸 로우들에 접근하다.

   

mysql_use_result() 함수를 가지고,  mysql_fetch_row() 함수는 실제로 서버로부터 로우를 검색한다. 각 로우에 있는 데이터 크기에 대한 정보는 mysql_fetch_lengths() 함수를 호출하여 이용할 수 있다.

   

결과 세트를 마친 후, 그것에 이용된 메모리를 제거하기 위해 mysql_free_result() 함수를 호출한다.

두 가지 검색 매커니즘은 상호 보완적이다. 클라이언트 프로그램은 요구에 가장 알맞은 접근을 선택한다.

실제로 클라이언트는 mysql_store_result() 함수를 통상적으로 쓰는 경향이 있다.

   

mysql_store_result() 함수의 장점은 로우들이 모두 클라이언트로 오기 때문에 사용자가 순차적으로 로우에 접근할 수 있고, 결과 세트 내에서 현재 로우 위치를 변경하기 위해 mysql_data_seek()또는 mysql_row_seek() 함수를 이용하여 앞뒤로 움직일 수 있다는 것이다. 그리고mysql_num_rows()함수를 호출하여 로우의 양을 알아볼 수 있다. 반면, On mysql_store_result() 함수의 메모리 요구사항은 큰 결과 세트 용으로 매우 높아 메모리가 부족해질 수 있다.

   

mysql_use_result() 함수의 장점은 한번에 하나의 로우씩만 유지하기 때문에(그리고 총 할당량이 적어 mysql_use_result() 함수가 더 빠를 수 있기 때문에) 클라이언트가 결과 세트에서 메모리를 덜 요구한다는 점이다. 단점은 서버를 간섭하는 것을 막기 위해 빨리 각 로우를 처리해야 하고, 결과 세트 내에서 로우들로 무작위로 접근할 수 없으며(로두를 순차적으로 엑세스할 수 있다), 로우를 모두 검색할 때까지 로우의 양을 사용자가 알 수 없다는 점이다. 게다가 사용자가 찾고자 하는 정보를 찾았다는 것을 검색 중에 알아도 모든 로우들을 검색해야만 한다.

   

API는 문이 SELECT 인지 아닌지도 모르고 클라이언트가 명령문에 적절하게 응답할 수 있도록 한다(필요한 로우만 검색). 각 mysql_query() 함수(또는 mysql_real_query()함수) 후에,mysql_store_result()함수를 호출하여 이것을 할 수 있다. 결과 세트가 성공적으로 호출되면, 명령문은 SELECT였고, 사용자는 로우들을 읽을 수 있다. 결과 세트 호출이 실패하면, 결과가 예정대로 되었는지 여부를 결정하기 위해서 mysql_field_count() 함수를 호출하라. 만약mysql_field_count() 함수가 0(zero)를 리턴하면, 문은 데이터를 리턴하지 않았고(INSERT,UPDATEDELETE 등으로 나타남), 리턴할 로우 또한 기대되지 않았다.(그래서 보여줄 데이터가 없다). 만약 mysql_field_count() 함수가 0(zero)이 아니라면, 문은 로우들을 리턴했을 수 있지만, 그러지 않았다. 이것은 문이 실패한 SELECT 였다는 것을 나타낸다. 이것이 어떻게 될 수 있는지 예를 보려면 mysql_field_count() 함수의 설명을 참조하라

   

mysql_store_result() 와 mysql_use_result() 두 함수로 결과 세트를 보완하는 필드에 대한 정보(필드의 숫자, 이름, 타입 등)를 얻을 수 있다. 사용자는 로우 내에서 mysql_fetch_field() 함수를 반복해서 호출하거나 또는 로우 내에서  mysql_fetch_field_direct() 함수를 호출하여 필드 숫자로 필드 정보에 순차적으로 접근할 수 있거나, 현재 필드 커서 위치는 mysql_field_seek()함수를 호출하여 변경할 수 있다. 필드 커서 설정은 다음 mysql_fetch_field() 함수로 호출에 영향을 미친다. 사용자는 mysql_fetch_field() 함수를 호출하여 한번에 필드에 대한 모든 정보를 얻을 수 있다.

   

에러를 발견하고 리포트하는 경우, MySQL은 mysql_errno() 와 mysql_error() 함수로 에러 정보로의 접근을 제공한다. 

이것들은 사용자가 에러가 언제 발생하고 그것이 무엇인지를 결정하도록 함으로써 성공 혹은 실패할 수 있는 가장 최근 호출된 함수에 대한 에러 코드 또는 에러 메시지를 리턴한다.

 

 

원문 : http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21770&cat1=22&cat2=596&cat3=605&lang=k

Posted by devanix