MYSQL C API 입문 강좌

MYSQL C API 입문 강좌
(1) 본 튜 토리 얼 에 대하 여
이것 은 MYQL 의 C 언어 프로 그래 밍 에 관 한 입문 강좌 로 MYSQL 의 C 를 다 루 었 다. API 프로 그래 밍 의 기본 지식.본 박문 은 프로 그래 밍 네 비게 이 션 네트워크 에서 제공한다.
(2) MYSQL 데이터베이스
MYSQL 은 선도 적 인 오픈 소스 데이터 관리 시스템 으로 다 중 사용자, 다 중 스 레 드 데이터베이스 시스템 입 니 다.MYSQL 은 웹 애플 리 케 이 션 에서 유 난 히 유행 하 는 LAMP (L - linux, A-apache, M-mysql, P - php) 플랫폼 의 일부분 입 니 다.MYSQL 은 최초 로 스웨덴 의 MYSQL 이 었 습 니 다. AB 회사 가 개발 한 이 회사 그리고 Trolltech. 아주 유명한 오픈 소스 회사 입 니 다.MYSQL 은 BSD 를 포함 한 대부분의 운영 체제 플랫폼 을 호 환 합 니 다. 유 닉 스, 리 눅 스, 윈도, MAC.위 키 백과 와 유 튜브 는 MYSQL 을 사용 하 는데 이 사이트 들 은 매일 수백 만 건의 조회 요청 을 처리한다.MYSQL 은 두 가지 버 전 을 포함 합 니 다. MYSQL 서버 버 전과 MYSQL 내장 버 전 입 니 다.
(3) 첫 번 째 예시
첫 번 째 예제 에서 MYSQL 의 API 함 수 를 간단하게 테스트 합 니 다. 코드 는 다음 과 같 습 니 다.
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
printf("MySQL client version: %s
", mysql_get_client_info());
return 0;
}

API mysql_get_client_info my sql 클 라 이언 트 의 버 전 번호 가 져 오기, 컴 파일:
gcc version.c -o version  `mysql_config --cflags --libs
프로그램 verion 을 실행 하면 다음 과 같은 출력 결 과 를 얻 을 수 있 습 니 다.
 $ ./version
 MySQL client version: 5.0.38
코드 설명:
 #include 
 #include 
우선, 우 리 는 필요 한 헤더 파일 my ql. h 와 my 를 포함 합 니 다.global. h, my sql. h 는 MYSQL 함수 호출 에 포 함 될 가장 중요 한 헤더 파일 입 니 다.my_global. h 는 전역 함수 의 성명 과 표준 입 출력 헤더 파일 을 포함 합 니 다.
printf("MySQL client version: %s", mysql_get_client_info());
이 코드 들 은 Mysql 클 라 이언 트 의 버 전 번 호 를 인쇄 했 습 니 다. my sql 을 사용 합 니 다.get_client_info API 호출.
 
(4) 데이터베이스 만 들 기
다음 코드 는 데이터 베 이 스 를 만 드 는 방법 을 보 여 줍 니 다.
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
if (conn == NULL) {
printf("Error %u: %s
", mysql_errno(conn), mysql_error(conn));
exit(1);
}
if (mysql_real_connect(conn, "localhost", "zetcode",
"passwd", NULL, 0, NULL, 0) == NULL) {
printf("Error %u: %s
", mysql_errno(conn), mysql_error(conn));
exit(1);
}
if (mysql_query(conn, "create database testdb")) {
printf("Error %u: %s
", mysql_errno(conn), mysql_error(conn));
exit(1);
}
mysql_close(conn);

}

상기 예제 코드 는 먼저 my sql 데이터베이스 에 연결 한 다음 에 testdb 데이터 베 이 스 를 만 듭 니 다.현재 데이터베이스 에 로그 인하 여 검증 합 니 다:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| testdb             |
+--------------------+
3 rows in set (0.00 sec)
경험 증, 데이터베이스 testdb 가 확실히 만 들 어 졌 습 니 다.
이 예제 코드 에서 우 리 는 오류 검 사 를 했 습 니 다. 오류 검 사 를 하 는 것 은 매우 중요 합 니 다. 왜냐하면 데이터 베이스 프로 그래 밍 에 많은 부분 에서 오류 가 발생 할 수 있 기 때 문 입 니 다.간단명료 하 게 보기 위해 서 뒤의 예 는 오류 검 사 를 무시 할 것 이다.
이 예제 코드 는 다음 과 같은 몇 가지 부분 으로 나 눌 수 있다.
1. 링크 구 조 를 초기 화 합 니 다.
2. 링크 를 만 듭 니 다.
3. 조 회 를 실시한다.
4. 링크 를 닫 습 니 다.
MYSQL* conn;
먼저, 하나의 conn 포인터 가 MYSQL 구조 체 를 가리 키 는데 이 구조 체 는 데이터베이스 연결 핸들 입 니 다.
conn = mysql_init(NULL);
함수 mysqlinit 는 링크 핸들 을 되 돌려 줍 니 다.
 if (conn == NULL) {
     printf("Error %u: %s", mysql_errno(conn), mysql_error(conn));
     exit(1);
 }
함수 반환 값 을 검사 합 니 다. my sql init 함수 가 실 패 했 을 경우 잘못된 정 보 를 인쇄 하고 프로그램 을 끝 냅 니 다.
if (mysql_real_connect(conn, "localhost", "zetcode", 
         "passwd", NULL, 0, NULL, 0) == NULL) {
     printf("Error %u: %s", mysql_errno(conn), mysql_error(conn));
     exit(1);
 }
함수 my sql real connect 는 my sql 데이터베이스 에 링크 를 만 듭 니 다. 이 함 수 를 호출 하면 제공 합 니 다. 링크 핸들, 호스트 이름, 사용자, 비밀번호 등 매개 변 수 는 마지막 네 개의 매개 변 수 는 데이터베이스 이름, 포트, 유 닉 스 소켓 과 클 라 이언 트 표지 이다.
if (mysql_query(conn, "create database testdb")) {
     printf("Error %u: %s", mysql_errno(conn), mysql_error(conn));
     exit(1);
 }
mysql_close(conn);
함수 my sql query 는 sql 문 구 를 실행 합 니 다. 이 예제 에서 새로운 데이터 베 이 스 를 만 들 것 입 니 다. 마지막 으로 데이터베이스 링크 를 닫 습 니 다.
 
(5) 표를 만 들 고 데 이 터 를 삽입 합 니 다.
이 예제 에 서 는 표를 만 들 고 데 이 터 를 삽입 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
mysql_query(conn, "INSERT INTO writers VALUES('Jack London')");
mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')");
mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')");
mysql_query(conn, "INSERT INTO writers VALUES('Emile Zola')");
mysql_close(conn);
}

이 예제 코드 에서 우 리 는 새로운 my sql 을 사용 하지 않 았 다. API, 생 성 표 와 삽입 데 이 터 는 모두 my sql query 함 수 를 사용 합 니 다.
1. 링크 만 들 기
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
2. writers 표를 만 듭 니 다. 이 표 는 한 열 만 있 고 유형 은 VARCHAR 입 니 다.
mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
3. 데이터 삽입
mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
mysql_query(conn, "INSERT INTO writers VALUES('Jack London')");
mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')");
mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')");
mysql_query(conn, "INSERT INTO writers VALUES('Emile Zola')");
4. 검증 데이터
mysql> select * from writers;
+-------------------+
| name              |
+-------------------+
| Leo Tolstoy       |
| Jack London       |
| Honore de Balzac  |
| Lion Feuchtwanger |
| Emile Zola        |
+-------------------+
5 rows in set (0.00 sec)
5. 링크 닫 기
mysql_close(conn);
(6) 데이터베이스 에서 데이터 조회
이 절 에서 우 리 는 표 에서 데 이 터 를 조회 하고 다음 과 같은 몇 단계 로 나 뉜 다.
1. 링크 만 들 기
2. 조회 실행
3. 결과 집합 가 져 오기
4. 모든 줄 가 져 오기
5. 석방 결과 집
6. 링크 해제
이 절 예제 코드 는 다음 과 같다.
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
MYSQL_RES *result;
MYSQL_ROW row;
int num_fields;
int i;

conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
mysql_query(conn, "SELECT * FROM writers");
result = mysql_store_result(conn);
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
for(i = 0; i < num_fields; i++)
{
printf("%s ", row[i] ? row[i] : "NULL");
}
printf("
");
}
mysql_free_result(result);
mysql_close(conn);
}

1. 조 회 를 실행 하고 writers 표 의 모든 데 이 터 를 되 찾 습 니 다.
mysql_query(conn, "SELECT * FROM writers");
2. 결과 집합 가 져 오기
result = mysql_store_result(conn);
3. writers 표 의 모든 필드 가 져 오기
num_fields = mysql_num_fields(result);
4. 줄 마다 데 이 터 를 가 져 와 화면 에 출력
 while ((row = mysql_fetch_row(result)))
  {
      for(i = 0; i < num_fields; i++)
      {
          printf("%s ", row[i] ? row[i] : "NULL");
      }
      printf("");
  }
 
5. 석방 결과 집
 mysql_free_result(result);
6. 링크 닫 기
 mysql_close(conn);
(7) 열 머리
이 절 에 서 는 조회 데 이 터 를 보 여 주 며 표 의 모든 열 이름 을 가 져 옵 니 다.
 우선, 우 리 는 새로운 시 계 를 만 들 고 데 이 터 를 삽입 합 니 다.
 mysql> create table friends (id int not null primary key auto_increment,
                               name varchar(20), age int);
 mysql> insert into friends(name, age) values('Tom', 25);
 mysql> insert into friends(name, age) values('Elisabeth', 32);
 mysql> insert into friends(name, age) values('Jane', 22);
 mysql> insert into friends(name, age) values('Luke', 28);
이 절 예제 코드 는 다음 과 같다.
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
MYSQL_RES *result;
MYSQL_ROW row;
MYSQL_FIELD *field;

int num_fields;
int i;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
mysql_query(conn, "SELECT * FROM friends");
result = mysql_store_result(conn);
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
for(i = 0; i < num_fields; i++)
{
if (i == 0) {
while(field = mysql_fetch_field(result)) {
printf("%s ", field->name);
}
printf("
");
}
printf("%s ", row[i] ? row[i] : "NULL");
}
}
printf("
");
mysql_free_result(result);
mysql_close(conn);
}

이 절 예제 코드 는 이전 절 과 유사 합 니 다. 표 의 열 이름 을 가 져 오 는 코드 만 추 가 했 습 니 다.
 while(field = mysql_fetch_field(result)) {
     printf("%s ", field->name);
 }
함수 mysql fetch field 는 구조 에서 열의 이름 을 가 져 올 수 있 는 MYSQL FIELD 구 조 를 되 돌려 줍 니 다. 컴 파일 후 프로그램 출력 은 다음 과 같 습 니 다.
$ ./headers
id name age
1  Tom  25
2  Elisabeth  32
3  Jane  22
4  Luke  28
 
(8) Mysql 데이터베이스 에 그림 삽입
어떤 사람 은 mysql 을 사용 하여 그림 을 저장 하 는 것 을 좋아 하고, 어떤 사람 은 그림 을 파일 시스템 에 저장 하 는 것 을 좋아한다. 그러나 우리 가 수천 개의 그림 을 처리 하려 고 할 때 기술적 인 문 제 를 일 으 킬 수 있다. 그림 을 저장 할 때 바 이 너 리 데이터, mysql 은 바 이 너 리 수 거 를 저장 하 는 특수 한 데이터 형식 이 있다. BLOB (Binary) 라 고 한다. Large Ojbect)。
mysql> describe images;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI |         |       |
| data  | mediumblob | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
이것 은 이 절 에서 우리 가 사용 할 표 입 니 다. 생 성 문 구 는 다음 과 같 습 니 다.
create table images(id int not null primary key, data mediumblob);
다음은 이 예 에서 모든 프로그램 코드 입 니 다.
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
int len, size;
char data[1000*1024];
char chunk[2*1000*1024+1];
char query[1024*5000];
FILE *fp;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
fp = fopen("image.png", "rb");
size = fread(data, 1, 1024*1000, fp);
mysql_real_escape_string(conn, chunk, data, size);
char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";
len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
mysql_real_query(conn, query, len);
fclose(fp);
mysql_close(conn);
}

이 예 에서, 우 리 는 그림 한 장 을 images 표 에 저장 합 니 다. 그림 의 크기 는 최대 1M 를 초과 하지 않 습 니 다.
우선 그림 파일 을 열 고 그림 데 이 터 를 읽 습 니 다.
 fp = fopen("image.png", "rb");
 size = fread(data, 1, 1024*1000, fp);
이 진 데 이 터 는 sql 구문 에 문 제 를 일 으 킬 수 있 는 특수 한 문 자 를 포함 할 수 있 습 니 다. 따라서 전 의 를 해 야 합 니 다. 이론 적 으로 모든 문 자 는 특수 문자 일 수 있 습 니 다. 따라서 chunk 배열 크기 는 data 배열 크기 의 두 배 입 니 다. 이 함 수 는 chunk 배열 에 엔 딩 부 호 를 추가 합 니 다.
 mysql_real_escape_string(conn, chunk, data, size);
insert 에 사용 할 sql 문 구 를 두 줄 코드 로 연결 합 니 다.
 char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";
 len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
마지막 으로 sql 문 구 를 실행 합 니 다:
mysql_real_query(conn, query, len);
(9) Mysql 데이터베이스 에서 그림 되 찾기
지난 절 에서 우 리 는 그림 을 데이터베이스 에 저장 했다. 이 절 에서 우 리 는 그림 을 데이터베이스 에서 되 찾 아 그림 으로 복원 했다. 이 절 예제 코드 는 다음 과 같다.
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
MYSQL_RES *result;
MYSQL_ROW row;
unsigned long *lengths;
FILE *fp;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
fp = fopen("image.png", "wb");
mysql_query(conn, "SELECT data FROM images WHERE id=1");
result = mysql_store_result(conn);
row = mysql_fetch_row(result);
lengths = mysql_fetch_lengths(result);
fwrite(row[0], lengths[0], 1, fp);
mysql_free_result(result);
fclose(fp);
mysql_close(conn);
}

우선 그림 을 저장 할 파일 을 만 듭 니 다.
fp = fopen("image.png", "wb");
그리고 우 리 는 이전의 그림 을 조회 해 냈 다.
 mysql_query(conn, "SELECT data FROM images WHERE id=1");
이후 이미지 데이터 와 데이터 길 이 를 얻 을 수 있 습 니 다.
row = mysql_fetch_row(result);
lengths = mysql_fetch_lengths(result);
마지막 으로 fwrite 를 사용 하여 그림 을 파일 에 저장 합 니 다.
fwrite(row[0], lengths[0], 1, fp);

좋은 웹페이지 즐겨찾기