mysql-installer-web-community-5.6.22.0.msi

MySQL용 ODBC 드라이버를 설치하지 않고 직접 라이브러리를 이용하는 방법으로 MS Visual C++ 6.0 환경에서 MySQL을 접근하는 방법을 살펴보겠다. 이 방법은 MySQL Database가 어디 있든 상관없이 MySQL서버에 접근 권한 설정만 되어 있으면 상관없겠다.

여기서 제시한 방법은 내가 사용한 방법이지 결코 답은 아니다. 더 좋은 방법이 있다면 함께 공유했으면 한다.
또 환경이 Visual C++ 6.0 이라고 해서 .NET환경에 적용하지 못한다는 법은 없다. 다 참고가 되는 내용이라고 생각한다.

여기서는 Window에 Apache, PHP, MySQL을 자동적으로 설치해주는 WAMP를 설치하고 필요한 개발관련 C Include 파일과 Lib, DLL File를 설정한 다음, 간단한 예제로 설명을 마무리 하겠다.

1. Window 환경에서 APM(Apache, PHP, MySQL) 설치하기


Window환경에 APM을 설치하는 방법은 여러가지가 있다. 그중 가장 쉬운 방법은 이미 나왔는 APM설치관련 패키지를 이용하는 것이 있다. 나는 WAMP라는 훌륭한 APM통합환경을 구축해주는 프로그램으로 쉽게 설치할 수 있었다. 이에 대해서는 아래 링크를 참고하길 바란다.

http://blog.jidolstar.com/77

만약 외부에 MySQL이 있다면 원격에서 접근이 가능한지 확인한 후(mysql DB에 user테이블 host필드가 %로 설정하는 것 같이 외부 접근권한이 설정되어 있어야 한다.) 사용하면 되겠다.

2. C언어 개발관련 Include 파일 및 Lib파일 설치하기


C언어 개발관련 파일을 설치하기 위해 먼저 http://dev.mysql.com/ 에 접속해서 왼쪽메뉴에 Downloads > MySQL Community Server > 5.1(또는 6.0이상) 으로 들어간다. 여기서 Windows downloads에서 Window Essentials(x86)을 직접 Download하던가 Pick a mirror에 들어가서 다운로드 받으면 된다.

다운로드를 받아 실행한다. 다음으로 넘어가면 기본 Typical이 설정되어 있을텐데 Custom으로 바꾼뒤 다음으로 넘어가면 아래와 같은 화면이 나온다.

사용자 삽입 이미지


여기서 C Include Files/Lib Files 만 제외하고 전부 닫아준 다음, 설치를 하면 C:\Program Files\MySQL\MySQL Server 5.1 에 include 폴더와 lib 폴더가 생성된다. include 폴더에는 C언어나 C++에서 사용할 수 있는 MySQL 관련 Header 파일들이 있다. 그리고 lib\opt 폴더 안에는 우리가 사용할 libmysql.lib을 포함한 Lib파일들이 존재하는 것을 확인할 수 있다.

MS Visual C++ 을 실행하고 Tools > Options를 선택하면 아래와 같은 창이 뜬다. Directories 탭을 선택하고 Show directorries for: Include files를 선택한 다음 아래와 같이 Mysql관련 Header 파일이 있는 폴더의 경로를 입력한다. 이런 설정이 필요한 것은 #include <mysql.h> 처럼 <>로 사용할 수 있게 설정하기 위한 것이다. 만약 이렇게 하지 않으면 필요할 때마다 include에 있는 header파일을 전부 복사해서 자신의 프로젝트 폴더에 복사해서 #include "mysql.h" 처럼 사용해야 할 것이다.
사용자 삽입 이미지

그리고 Show directories for:를 Library files를 선택후 Lib가 존재하는 폴더의 경로를 입력하도록 한다.
이 작업을 하지 않으면  프로젝트를 새로 생성해서 작업할때 마다 필요한 lib를 복사해서 사용해야 하므로 아주 번거롭다. Lib파일은 DLL를 로드하고 링크하는 역할을 담당하게 된다.

사용자 삽입 이미지



3. libmysql.dll을 system32폴더에 복사하기


Visual C에서 MySQL을 사용하기 위해 libmysql.dll을 C:\windows\system32 폴더에 있어야 한다.
지금까지 설정만으로는 그렇게 되어 있지 않음을 알 수 있다. DLL 파일은 함수의 집합체라고 할 수 있다. Lib에 의해 로드가 되며 C언어에서는 사용되는 함수의 선언 Header파일로 접근이 가능하겠다.

MySQL의 함수 집합체인 DLL은 libmysql.dll은 앞서 APM을 설치했으므로 C:\wamp\php 폴더에 있다. libmysql.dll을 복사해서 C:\windows\system32 에 복사하면 되겠다.
만약 APM을 설치 안했다면 http://dev.mysql.com 에 접속해서 downloads>connector > Connector/PHP 로 들어가 mysql extention에서 for MySQL Server에 들어가 >>No thanks, just me to the download!를 선택해 다운로드 받아 압축을 풀면 libmysql.dll을 받을 수 있을 것이다.

만약 이 작업을 안한 상태에서 프로젝트 생성후 제작한 MySQL관련 프로그램 실행하면 libmysql.lib이 libmysql.dll을 로드하지 못해서 실행할 수 없다는 에러가 나올 것이다. 이 말은 자신의 프로그램의 결과물인 .exe파일 뿐 아니라 dll도 함께 배포해야한다는 것을 의미하기도 한다.


4. 간단한 예제


이 예제를 실행하기 전에 반드시 MySQL 계정에 자신의 계정 및 접속권한을 확인해야한다.
생각보다 어렵지 않게 실행할 수 있을 것이며

#define SOCKET int 는 맨 위해 #include <mysql.h>는 반드시 다른 include 포다 아래쪽에 있어야 에러를 발생하지 않는다.

#pragma comment()문은 lib를 프로젝트 셋팅할때마다 Project > Setting 에서 link에 libmysql.lib와 ws2_32.lib를 modules에 등록하는 번거로움을 덜기 위해 사용한다.

C코드 예제 (Language : c)
#define SOCKET int

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

#pragma comment(lib, "libmysql.lib")
#pragma comment(lib, "ws2_32.lib")   

#define DB_HOST "호스트 IP, 도메인 또는 localhost"
#define DB_USER "접속 ID"
#define DB_PASS "접속 암호"
#define DB_NAME "DB명"

#define SQL_CREATE_TABLE "CREATE TABLE `mysql_api_test` (\
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,\
    `num` INT NULL ,\
    `string` VARCHAR( 20 ) NULL \
    ) TYPE = MYISAM ;" //"
#define SQL_INSERT_RECORD "INSERT INTO `mysql_api_test` ( `id` , `num` , `string` ) \
    VALUES (\
    NULL , '%d', '%s'\
    );" //"
#define SQL_SELECT_RECORD "SELECT * FROM `mysql_api_test`"
#define SQL_DROP_TABLE "DROP TABLE `mysql_api_test`"

int main()
{
    MYSQL *connection=NULL, conn;
    MYSQL_RES *sql_result;
    MYSQL_ROW sql_row;
    int query_stat;
    int i;

    char query[255];

    mysql_init(&conn);

    // DB 연결
    connection = mysql_real_connect(&conn, DB_HOST,
        DB_USER, DB_PASS,DB_NAME, 3306,(char *)NULL, 0);
    if(connection==NULL)
    {
        fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
        return 1;
    }

    // 테이블 생성
    query_stat=mysql_query(connection,SQL_CREATE_TABLE);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // 레코드 삽입
    for(i=0;i<5;i++)
    {
        sprintf(query,SQL_INSERT_RECORD,100+i,"안녕하세요 지돌스타예요~");
        query_stat = mysql_query(connection, query);
        if (query_stat != 0)
        {
            fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
            return 1;
        }
    }

    // 셀렉트
    query_stat=mysql_query(connection,SQL_SELECT_RECORD);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // 결과 출력
    sql_result=mysql_store_result(connection);
    while((sql_row=mysql_fetch_row(sql_result))!=NULL)
    {
        printf("%2s %2s %s\n",sql_row[0],sql_row[1],sql_row[2]);
    }
    mysql_free_result(sql_result);

    // 테이블 삭제
    query_stat=mysql_query(connection,SQL_DROP_TABLE);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // DB 연결 닫기
    mysql_close(connection);
    return 0;
}



참고사이트

MySQL 공식 Development 사이트 : http://dev.mysql.com
MySQL++ : http://tangentsoft.net/mysql++/
MySQL API 사용하기 : http://deadwi.jaram.org/wiki/wikka.php?wakka=KnowingCppMySqlAPI
[그리즐리의 ATL/MFC 팁]MySQL 시작하기 : http://blog.naver.com/hello20/150021875380

글쓴이 : 지돌스타(http://blog.jidolstar.com/250)

'개발지식창고 > DataBase' 카테고리의 다른 글

[SQLITE] SQLITE 관련 사이트  (0) 2013.06.28
[SQLITE] 자료형  (0) 2013.06.28
MySQL : Data Type (1 of 2)  (0) 2010.08.31
MFC MYSQL 연동  (0) 2010.08.31
[MySQL] 기본명령어  (0) 2010.08.31
Posted by 모과이IT
,
MySQL 데이타 타입

MySQL의 데이타 타입은 수치, 문자열, 날짜와 시간, 공간 데이터 타입으로 분류된다.
우선 종류를 살펴 보자

수치 데이터 타입
  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT         - 정수
  • BIGINT
  • DECIMAL - 고정 소수
  • FLOAT     - 단정도 부동 소수
  • DOUBLE  - 배정도 부동 소수
  • BIT         - 비트 필드
문자열 데이터 타입
  • CHAR
  • VARCHAR
  • BINARY        - 이진 문자열
  • VARBINARY
  • TINYBLOB
  • BLOB            - Binary Large OBject
  • MEDIUMBLOB
  • LONGBLOB
  • TINYTEXT
  • MEDIMUTEXT
  • LONGTEXT
  • ENUM          - 열거형
  • SET             - 집합형
날짜와 시간 데이터 타입
  • DATE          - 날짜           ( CCYY-MM-DD )
  • TIME           - 시간           ( hh:mm:ss )
  • DATETIME   - 날짜와 시간 ( CCYY-MM-DD hh:mm:ss )
  • TIMESTAMP - 타입스탬프 ( CCYY-MM-DD hh:mm:ss )
  • YEAR           - 연도          ( CCYY 또는 YY )
공간 데이터 타입
  • GEOMETRY     - 공간 값
  • POINT             - 포인트(한 쌍의 X,Y 좌표)
  • LINESTRING    - 커브 (하나 이상의 POPINT 값)
  • PLYGON          - 폴리곤
  • GEOMETRYCOLLECTION  - GEOMETRY 값의 집합
  • MULTILINESTRING   - LINESTRING의 집합
  • MUlTIPOINT             - POINT 값의 집합
  • MULTIPOLYGON       - POLYGON 값의 집합

기본값
  •  AUTO_INCREMENT 속성을 가지는 컬럼을 제외한 모든 컬럼 타입에 대해 기본값이 명시되지 않았다면 숫자 컬럼의 기본 값은 0 이다.
  • TIMESTAMP를 제외한 날짜와 시간 타입에 대해서 기본 값은 "제로" 이다 (예, 0000-00-00 ) 
  • TIMESTAMP의 기본값은 컬럼의 현재 날짜와 시간이다.
  • ENUM 이외의 다른 문자열 타입에서 기본 값은 비어 있다. 
  • ENUM 에 기본 값은 첫번째 열거 요소이다.

어떤 칼럼들이 DEFAULT 절을 가지는지, 그리고 칼럼이 어떤 기본 값을 가지는지 살펴보려면 다음 명령을 이용한다.
mysql> SHOW CREATE TABLE [테이블 이름];

수치 데이타의 범위
 타입 부호 있는 값 부호 없는 값 저장 공간 
TINYINT [ (M) ] -128 ~ 127 0 ~ 255 1 바이트 
SMALLINT [ (M) ] -32768 ~ 32767 0 ~ 65535 2 바이트 
MEDIUMINT [ (M) ] -8388608 ~8388607  0 ~ 16777215 (2^24-1) 3 바이트
INT [ (M) ] -2147683648 ~ 2147483647  0 ~ 4294967295 (2^32-1)  4 바이트
BIGINT [ (M) ] -9223372036854775808 ~ 92233720368547758087   0~18446744073709551615 (2^64-1) 8 바이트 
DECIMAL ( [M[,D]] )  -  - M과 D에 따라 다름 
FLOAT [ (M,D ]   -  - 4 바이트 
DOUBLE [ (M,D) ]   -  - 8 바이트 
BIT[ (M) ]    0 ~ 2^M-1  M에 따라 다름

  • 정수  컬럼을 선언 할 때, 선택적인 크기 M을 지정할 수 있다. M은 1에서 255까지 정수 이다. 이것은 컬럼 값을 표시하는 데 사용되는 문자들의 수에만 관련이 있지 저장공간의 바이트 수와는 아무런 관련이 없다.
  • DECIMAL에서 M은 유효자리수, D는 소숫점 자리수를 나타낸다. M은 1부터 65, D는 0부터 30까지 값을 가지고 M보다 클 수 없다. (예를 들어 DECIMAL(5,1) 이라면 값의 범위는 -9999.9 ~ 9999.9 까지 이다.)
  • DECIMAL, DECIMAL, FIXED 은 동의어이다.
  • REAL은 DOUBLE과 동의어이다. (SQL 모드 REAL_AS_DEFAULT가 활성화 되면 REAL은 FLOAT와 동의어가 됨)
  • DOUBLE, FLOAT에서 M은 유효 자릿수 (1~255), D는 십진 자릿수 (0~30) 이다. DECIMAL과 달리 M,D의 지정은 선택사항이다.
문자열 데이타의 범위
 타입 최대 크기 필요한 저장공간
VARBINARY [ (M)  ] M 바이트 L+1 또는 2 바이트 
CHAR [ (M) ] M 문자 M x w 바이트
VARCHAR (M) M 문자 L+1 또는 2 바이트 
TINYBLOB 2^8-1 바이트  L+1 바이트 
BLOB 2^16-1 바이트  L+2 바이트 
MEDIUMBLOB  2^24-1 바이트  L+3 바이트
LONGBLOB 2^32-1 바이트  L+4 바이트 
TINYTEXT 2^8-1 문자 L+1 바이트 
TEXT 2^16-1 문자  L+2 바이트 
MEDIUMTEXT 2^24-1 문자 L+3 바이트 
LONGTEXT 2^32-1 문자  L+4 바이트 
ENUM('value1','value2', ...) 65,535개의 요소  1또는 2 바이트
SET('value1','value2', ...) 64개의 요소  1,2,3,4, 또는 8 바이트 
  • M은 컬럼 값의 최대 길이, L은 바이트 단위로 주어진 값의 실제 길이를 나타낸다.
  • BINARY(20)은 20바이트를 가지며, CHAR(20)은 20개의 문자를 가진다.

Reference
  • MySQL의 사용, 관리, 프로그래밍을 위한 완벽 가이드, Paul Dubois 저 / 김형훈 역, 지&선

'개발지식창고 > DataBase' 카테고리의 다른 글

[SQLITE] 자료형  (0) 2013.06.28
MFC 환경에서 MySQL 연동하는 방법  (0) 2010.08.31
MFC MYSQL 연동  (0) 2010.08.31
[MySQL] 기본명령어  (0) 2010.08.31
[MySQL] 데이타베이스명령어  (0) 2010.08.31
Posted by 모과이IT
,

가장 먼저 Mysql을 설치 하여야 한다.
설치법은 찾기가 쉽고 금방 설치할 수 있다. 대신 꼭 필요한 부분만 언급 하겠다.


꼭 참조 ~~
이제 안의 setup.exe을 실행시키면 마법사가 질문을 이것저것 던지는데 다음의 것만 신경쓰면 된다. (어차피 우리가 필요한것은라이브러리 파일일 뿐이다.) custom설치를 선택하고 다음처럼 라이브러리 파일만 설치하는 것으로 한다.

사용자 삽입 이미지

Developer component 가 바로 라이브러리 파일을 설치하는 것이다. 그냥 typical설치하면 이 라이브러리가 "절대!" 깔리지 않으니 반드시 커스텀 설치로 하길 바란다.

여기 그림에서 처럼 서버를 설치 하지 않은 것이 아니라 난 다 설치하여 사용하였다.

설치가 끝났으면 지금 아주 중요한 셋팅이 있다. 자료도 많고 했지만 .NET2005에서 하는 거
라 많은 실수를 했다.

1. 설치가 끝난 후 MySQL이 깔려 있는  폴더에 가면 다음 그림을 볼 수 있다.

사용자 삽입 이미지

2. 라이브러리와 인클루드 폴더를 도구 -> 옵션-> 프로젝트 및 솔루션 에서 다음 그림과 같이 디렉토리 설정를 걸어 두어야 한다.
1) 라이브러리 디렉토리 설정

사용자 삽입 이미지


2) include폴더 디렉토리 설정을 한다.
사용자 삽입 이미지

3. 이제 모든 설정은 끝이 나고 다음과 같이 프로젝트 폴더에 그림과 같이 libmySQL.dll과 libmysql 라이브러리 파일을 폴더로 복사한다. 이 파일은 쉽게 MySQL 설치 폴더에 가면 찾을 수 있다.

사용자 삽입 이미지


이렇게 설정은 끝이 난다.

다음은 실질적인 코딩을 하는 것이다.
먼저 stdafx.h에 다음과 같은 구문을 추가한다.
사용자 삽입 이미지
이렇게 추가 시킨 후

Doc.h에 다음과 같은 코드를 추가하였다. "127.0.0.1"을 호스트로 바꾸면 자기 컴퓨터에 서버의 호스트 주소가 되는 것이다.
사용자 삽입 이미지

이렇게 헤더 파일을 설정 후 Doc.cpp파일에 실질적인 코딩을 하였다.
사용자 삽입 이미지
이렇게 하여 DB와 연동이 되는 것을 확인할 수 있었다.

'개발지식창고 > DataBase' 카테고리의 다른 글

MFC 환경에서 MySQL 연동하는 방법  (0) 2010.08.31
MySQL : Data Type (1 of 2)  (0) 2010.08.31
[MySQL] 기본명령어  (0) 2010.08.31
[MySQL] 데이타베이스명령어  (0) 2010.08.31
[MySQL]MySQL 테이블수정  (0) 2010.08.31
Posted by 모과이IT
,