MySQL kFAQ ver. 0.0.1 작성자 : 허정수(wertyu@nownuri.net) 최초 작성일 : 1999년 12월 19일 MySQL kFAQ ver. 수정자 : 수정일 : ------- 차례 ---------- 0. 포기 선언 1. 이 문서에 대해서 2. MySQL의 특징 및 일반적인 질문들 2.1 MySQL의 특징은 무엇인가요? 2.2 Transaction이 지원 안된다면서요? 2.3 License 방식을 알고 싶습니다. 2.4 와우~ MySQL을 설치하고 싶네요. 어떻게 해야 되죠? 3. MySQL의 설치에 관한 질문들 3.1 설치는 어렵나요? 3.2 설치에 필요한 하드웨어 최소 사양은 얼마나 되나요? 3.3 설치하는 방법 좀 알려주세요. 3.4 MySQL의 데몬의 구동 3.5 흑흑..-_-; Access Denied가 나옵니다. 4. MySQL의 관리에 관한 질문들 4.1 설치 후에 해야 할 일들 4.2 새로운 사용자 추가 4.3 Access Denied 좀 해결해주세요! 4.4 root 암호를 잊어 버렸어여 T.T 4.5 흠... 백업을 하려고 하는데... 4.6 MySQL을 업그레이드 하려고 합니다. 4.7 MySQL을 부팅 시에 자동으로 실행되게 하고 싶은에요. 4.8 mysqld ended라고 나오면서 데몬이 계속 죽습니다. 5. MySQL에서의 SQL 언어에 관한 질문들 5.1 SQL 이란게 모죠? 5.2 ANSI SQL92와 MySQL의 SQL과의 차이점은 몹니까? 5.3 MySQL의 데이타 타입에 대해서 5.3.1 MySQL의 데이타 타입을 알려주세요 5.3.2 값이 자동으로 1씩 증가하게 하고 싶은데요. 5.3.3 AUTO_INCREAMENT는 몬가요? 5.3.4 한 컬럼에서 최대 얼마나 저장할 수 있나요? 5.3.5 게시판 등의 본문을 저장하고 싶은데요.. 뭘 써야 하죠? 5.4 MySQL에서의 SQL 언어 5.4.1 CREATE 5.4.2 INSERT 5.4.3 SELECT 5.4.4 ALTER 5.4.5 어떤 database들이 있나 알고 싶은데요? 5.4.6 어떤 테이블들이 있나 알고 싶어요. 5.4.7 테이블의 컬럼 형식을 알고 싶어여. 6. MySQL+PHP+Apache에 관한 질문들 6.1 설치하는 방법 7. MySQL C API에 관한 질문들 7.1 알파벳 순으로 정리한 각 함수들의 설명을 넣자. 7.2 간단한 예를 얻을 수 없을까요? 8. MySQL과 Perl에 관한 질문들 In the Future ------------------------ 0. 포기 선언 이 문서에 있는 내용을 따라해보다 당신의 컴퓨터에 어떠한 문제가 발생해도 필자에게는 전혀 책임이 없다. 따라서 이 문서를 읽는 사람들은 신중해야 한다. 1. 이 문서에 대해서 필자는 1998년 7월 처음으로 MySQL을 사용해 보았다. 지금처럼 많은 사람들이 MySQL을 쓰고 있지 않았으므로 문제에 부딪쳤을 때 해결하기가 쉽지 않았다. 요즘은 필자에게 질문을 해오는 사람들이 많다. 질문을 해오는 사람들의 질문을 보면 메뉴얼만 보면 해결할 수 있는 문제들이 대부분이지만, 처음부터 영어로 된 방대한 양의 메뉴얼을 읽기란 쉬운 것이 아니고, 또한 문제에 봉착한 사람들의 *답답한* 마음을 알기에 최대한 시간을 내어 질문에 답을 해 주고 있다. 이 문서는 i) 필자에게 온 질문들 ii) 필자가 생각한 '흠, 이 문제는 누가 질문할거 같은데' 라고 생각한 질문들과 답을 모아 놓은 문서들이다. 7개의 섹션으로 질문들을 나눠 놓았다. 하지만, 이 문서를 수정하는 사람은 누구나 새로운 섹션을 추가할 수 있고, 질문이 적절한 섹션에 있지 않을 경우 옮길 수 있다. 현재 이 문서는 MySQL 3.22.20 버전의 메뉴얼을 참고하였다. 2. MySQL의 특징 및 일반적인 질문들 2.1 MySQL의 특징은 무엇인가요? 메뉴얼에는 MySQL의 특징을 다음과 같이 말하고 있습니다. i) 커널 스레드를 이용한 멀티 스레드를 지원한다. 따라서, CPU가 여러 개 있을 경우 여러 개의 CPU를 잘 활용할 수 있다. i) C, C++, Java, Perl, PHP, Python 과 TCL에 대한 API를 제공한다. i) 여러 플랫폼에서 작동한다. i) 많은 컬럼 타입을 제공한다. i) one-sweep multijoin을 이용하여 Join이 매우 빠르다. i) SQL 함수들은 Optimized된 class library를 이용하여 구현되었다. 또한 매우 빠르며, 불필요한 메모리 할당을 하지 않는다. i) 권한과 암호 시스템은 flexible하고 보안이 잘 되어 있다. 원격의 서버에 접속할 때 모든 암호들은 암호화 되어 전송된다. i) ODBC를 지원한다. 따라서 Access를 이용해서 MySQL에 연결할 수 있다. i) 테이블에 16개의 인덱스를 줄 수 있다. i) 크기가 큰 데이타 베이스도 다룰 수 있다. 우리는(MySQL 메뉴얼 작성자) 50,000,000 개의 레코드를 가지고 있는 데이타베이스도 다루고 있다. i) 메모리 누수가 없다.(상용 메모리 누수 감지 프로그램으로 테스트 했다) i) isamchk라는 유틸리티로 테이블 검사, 성능향상, 수리 등을 할 수 있다. 이상이 MySQL의 메뉴얼에서 말하는 MySQL의 특징들을 정리한 것입니다. 하지만 개인적으로 MySQL의 가장 큰 특징은 _빠르다_ 라고 생각합니다. 그리고 리눅스 상에서 손쉽게 무료로 구해서 쓸 수 있고, 또한 사람들이 많이 쓰고 있으므로, 문제가 생겼을 때 대답을 해줄 사람들도 그만큼 많겠죠. 2.2 Transaction이 지원되지 않는 다면서요? 네. 그렇습니다. MySQL은 Transaction을 지원하지 않습니다. MySQL 개발자들은 Transaction이 속도를 매우 느리게 하므로 Transaction을 구현하지 않기로 했습니다. 하지만, 꼭 Transaction을 써야 할 경우 lock/unlock tables를 이용하여 비슷한 효과를 낼 수 있습니다. 2.3 MySQL의 License 방식을 알고 싶습니다. 기본적으로 MS Windows 계열을 제외한 모든 OS에서는 무료로 사용할 수 있습니다. 다만 상용을 목적으로 사용하거나, MS Windows 계열에서 사용할 경우에는 License를 사야합니다. 1 Copy에 US 200$입니다. 상용으로 사용한다고 해고, License없이 쓸 수 있는 경우가 있습니다. 돈이 들어간 문제는 복잡하므로 더 이상 이야기 하고 싶지 않습니다. 중요한 것은 무료로 사용할 수 있다는 것이죠. 2.4 와우~ MySQL을 설치하고 싶네요. 어떻게 해야 되죠? 이제 MySQL에 매력을 느꼇나 보죠? 설치 방법은 _3.3 MySQL을 설치하는 방법 좀 알려주세요_ 부분을 읽어 보시기 바랍니다. 3. MySQL의 설치에 관한 질문들 3.1 설치는 어렵나요? NEVER! 절대 어렵지 않습니다. 간혹 어려움을 겪는 사람들이 있는데 대부분은 메뉴얼 등을 읽지 않고 대충 설치를 한 경우입니다. 3.2 설치에 필요한 하드웨어 최소 사양은 얼마나 되나요? 리눅스가 설치될 수 있는 하드웨어면 됩니다. 오라클을 설치하다가 하드 디스크가 모라자서 윈도 파티션을 지웠던 기억이 나는군여 -_-. MySQL은 정말 작고 빠릅니다. ~ 3.3 설치하는 방법 좀 알려주세요. MySQL을 설치하는 방법에는 rpm으로 설치하는 방법과 Source Code로 설치하는 방법이 있겠죠. 개인적으로 rpm으로 설치하는 방법은 추천하지 않습니다. rpm으로 설치하면 뭐랄까.. 재미가 없죠. Source Code로 설치하면 재미도 있고, 더욱 좋은 것은 설치하고자 하는 소프트웨어에 대해 좀더 깊이 알 수 있습니다. 일단 MySQL의 소스 코드를 http://www.mysql.com에서 다운 받습니다. 다운받은 파일을 적당한 디렉터리로 복사한 후에 다음과 같은 명령을 내리면 됩니다. $ gzip -d mysql-Version.tar.gz $ tar xvf mysql-Version.tar $ cd mysql-Version $ ./configure $ make $ make check $ su (root 유저가 아닐 경우에만 실행) # make install $ cd scripts $ ./mysql_install_db 특별한 문제 없이 설치가 잘 될 것입니다. 기본적으로 MySQL이 설치되는 디렉터리는 /usr/local/mysql 입니다. 하지만, 자기가 운영하는 서버가 아닌 학교의 서버 등에 MySQL에 설치할 경우 /usr/local/mysql에 쓰기 권환이 없으므로 다른 디렉터리로 지정을 해야 하죠 설치할 디렉터리를 지정하는 방법은 $ ./configure --prefix=/원하는/디렉터리 위처럼 하시면 됩니다. 설치된 디렉터리 밑의 bin 디렉터리에 실행 파일들이 생깁니다. 3.4 MySQL 데몬의 구동 MySQL의 데몬이 실행되고 있어야 mysql을 사용할 수 있겠죠. MySQL이 설치된 디렉터리 밑의 bin/ 디렉터리에 보면 safe_mysqld라는 프로그램이 있습니다. $ safe_mysqld & 이렇게 실행을 하면 MySQL의 데몬이 구동되죠. MySQL은 TCP/IP로 Client와 통신을 하게 될 때 3306번 포트를 사용합니다. 이 포트를 바꾸려면 $ safe_mysqld -P 3333 & 이렇게 -P 옵션으로 포트 번호를 바꿀 수 있습니다. 3.5 흑흑..-_-; Access Denied가 나옵니다. _4.3 Access Denied 좀 해결해주세요!_ 부분을 보시기 바랍니다. 4. MySQL의 관리에 대한 질문들 4.1 설치 후 해야 할 일들 설치 후 가장 먼저 해야 할 일은 root user의 암호를 정하는 일입니다. MySQL은 사용자을 -u 옵션으로 지정합니다. -u 옵션이 없을 경우 기본적으로 사용자의 계정을 사용합니다. 또한 MySQL의 root 유저에는 초기에 암호가 걸려있지 않습니다. 따라서 root 가 아닌 아무 사용자라도 [wertyu@ localhost] $ mysql -u root 처럼 해서 MySQL의 root 사용자가 될 수 있습니다. 시스템의 계정이름과 MySQL의 계정 이름이 다르 다른 것을 꼭 기억하고 있어야 합니다. 암호를 거는 방법은 세 가지가 있습니다. i) update를 이용하는 방법 SQL 문 중 update를 이용해서 mysql database 중 user table의 root 사용자의 암호를 거는 방법입니다. $ mysql -u root mysql mysql> update user set password = password('새로운암호') where user = 'root'; mysql> flush privileges ; MySQL에서는 사용자의 암호를 암호화 하여 저장합니다. 암호를 암호화 하는 함수가 password()라는 함수이죠. ii) SET PASSWORD를 이용하기 mysql> SET PASSWORD for root=password('새로운암호'); iii) mysqladmin를 이용하는 방법 $ mysqladmin -u root password 새로운암호 이렇게 3 가지 방법 중 하나로 root 사용자의 암호를 바꾸실 수 있습니다. 이때 i) 번 방법으로 할 경우 꼭 flush privileges; 를 실행 시켜야 합니다. 이제 mysql을 쓸 때마다 -p 옵션을 붙여야 합니다. $ mysql -u root -p 4.2 새로운 사용자 추가 새로운 사용자를 추가해 보겠습니다. $ mysql -u root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO > wertyu@localhost > IDENTIFIED BY '암호' WITH GRANT OPTION; 이렇게 해서 모든 database에 대해서 모든 권한을 갖는 localhost의 wertyu라는 사용자를 추가했습니다. 필자는 귀찮은 명령을 기억하기 싫으므로 보통 다음 처럼 사용자를 직접 INSERT합니다. $mysql -u root mysql mysql> INSERT INTO user VALUES('localhost', 'wertyu', password('암호') > 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') ; mysql> FLUSH PRIVILEGES ; 사용자가 어느 하나의 database에만 접근을 하도록 추가할 경우가 있습니다. 그때는 다음과 같은 명령을 내리면 됩니다. mysql> GRANT ALL PRIVILEGES ON inos.* > TO wertyu@localhost IDENTIFIED by '암호'; 위처럼 하여 inos라는 database에 모든 권한을 갖는 wertyu라는 사용자를 추가할 수 있습니다. 다음 명령은 SELECT, INSERT, UPDATE 권한만을 줄때의 명령입니다. mysql> GRANT SELECT, INSERT, UPDATE ON inos.* > TO wertyu@localhost IDENTIFIED by '암호' ; 4.3 Access Denied 좀 해결해주세요! Access Denied가 나오면서 연결이 안되는 이유는 많이 있죠 MySQL을 처음 설치하고 난 후에 $ mysql -u root mysql 이라는 명령을 내렸는데도 Access Denied가 나왔다면 설치과정의 mysql_install_db 명령을 빼먹고 설치 하신 것입니다. Access Denied using password no 라고 나온다면 암호가 걸려 있는 사용자인데 암호를 입력하지 않아서 나는 에러입니다. Access Denied using password yes 라고 나온다면 암호를 사용했는데 입력한 암호가 틀렸을 경우이죠. 이 외에도 수많은 경우가 있는데, 이 부분은 이 글을 읽는 다른 사용자들이 직접 추가했으면 하는 바램입니다. 다함께 참여하는 문서가 되었으면 합니다. 4.4 root 암호를 잊어 버렸어여 T.T root의 암호를 잊어 버렷을 때 정말 난감하죠. 그렇다고 다시 MySQL을 설치하기에도 귀찮고 말이죠. 이 경우에도 방법이 있습니다. 먼저 MySQL의 데몬이 실행 중이라면 데몬의 실행을 중지 시키세요. 이제 다시 MySQL의 데몬을 실행 시키는데 -Sg라는 옵션을 줍니다. $ safe_mysqld -Sg & -Sg는 Skip grant table의 약자이지요. 이렇게 데몬을 실행 시키면 권한을 검사하지 않으므로 누구나 MySQL에 접근할 수 있습니다. 이제 mysql database의 user table의 암호 부분을 UPDATE를 이용해서 직접 수정해 주면 되겠죠. MySQL 전체를 다시 설치하는 수고를 덜었으면 합니다. ^^ 4.5 흠... 백업을 하려고 하는데...어떻게 해야 하나요? 백업을 하는 방법은 크게 두 가지 방법이 있습니다. MySQL의 데이타가 있느 디렉터리 밑에 있는 파일들을 그냥 모두 복사해뒀다가, 필요할 때 다시 처음 위치에 덮어 씌우는 방법이 있습니다. 다른 방법으로는 mysqldump라는 유틸리티를 이용하는 방법 입니다. mysqldump를 사용하는 방법을 설명 드리겠습니다. $ mysqldump [OPTIONS] database [tables] mysqldump는 SQL statement들을 생성합니다. 현재 database안에 들어 있는 테이블의 형식과 테이블 안의 데이타들 똑같이 만들어 낼 수 있는 SQL statement들을 생성합니다. 예를들어 foo라는 database가 있다고 가정하고, foo를 백업받으려고 할 경우 $ mysqldump foo > foo.backup 이렇게 하면 됩니다. mysqldump는 기본적으로 표준 출력으로 SQL statement들을 출력하므로 foo.backup이라는 파일로 저장했습니다. 복구를 하려면, $ mysql foo < foo.backup 이런 식으로 저정된 SQL statement를 실행 시키면 됩니다. 4.6 MySQL을 업그레이드 하려고 합니다. 기존의 데이타들은 어떻게 되죠? 업그레이드를 할 경우, 새로운 버전의 MySQL 문서에서 업그레이드에 관한 문서를 꼭 읽어보셔야 합니다. 3.22.x 버전과 3.23.x의 데이타들은 호환이 됩니다. 그리고 Major 버전이 같으면 데이타들은 거의 호환이 됩니다. 또한, 버전이 올라가면서 데이타들이 호환이 안 될 경우, 테이블의 구조를 업그레이드 시켜주는 유틸리티도 같이 배포됩니다. 따라서 버전이 크게 변하지 않는 이상 MySQL의 업그레이드는 MySQL의 설치 과정에서 mysql_install_db 과정만 빼면 됩니다. 4.7 MySQL을 부팅 시에 자동으로 실행되게 하고 싶은데요. 제가 보통 쓰는 방법은 /etc/rc.d/rc.local (레드햇 기준) 파일에 MySQL이/설치된/디렉터리/safe_mysqld& 위의 한 줄을 추가 하는 방법입니다. 4.8 mysqld ended라고 나오면서 데몬이 계속 죽습니다. 이런 경우 MySQL의 error log 파일을 살펴 봐야 정확한 이유를 알 수 있습니다. error log는 기본적으로 MySQL의 데이타가 저장된 디렉터리에 host_name.err 라는 이름으로 저장됩니다. 정확히 어디인지 모를 경우 safe_mysqld 파일을 보고 MySQL의 데이타들이 어느 디렉터리에 저장되는지 확인해 보시면 됩니다. error log의 파일을 보고 에러의 원인을 알아낸 후 문제를 해결하면 됩니다. 문제가 해결이 안될 경우 error log 파일의 내용을 wertyu@nownuri.net으로 보내주시면 최대한 도움을 드리도록 노력해 보겠습니다. 5. MySQL에서의 SQL 언어에 관한 질문들 5.1 SQL 이란게 모죠? SQL(Structured Query Language)는 DBMS에서 데이타들을 조작하기 위한 언어입니다. 언어라고 해서 C 언어처럼 컴파일을 하고 그렇진 않습니다. 단순히 DBMS에 Query를 하고 결과를 얻어 오는 언어입니다. 하지만 DB를 배우기 위해서는 꼭 배워야 하는 언어입니다. SQL 언어에 대해서 간단하게 나마 배워보고자 하면 _5.4 MySQL에서의 SQL 언어_부분을 읽어보시기 바랍니다. 5.2 ANSI SQL92와 MySQL의 SQL과의 차이점은 몹니까? 이 부분은 MySQL 메뉴얼에서 5 장을 읽어 보시면 자세히 알 수 있습니다. MySQL에 없는 기능들은 다음과 같습니다. i) sub-selects i) select into table i) Stored procedures and triggers ( Stored procedure는 앞으로 지원할 계획임) 5.3 MySQL의 데이타 타입에 대해서 5.3.1 MySQL의 데이타 타입을 알려주세요 밑의 정리된 자료는 제가 예전에 리눅스 월드라는 잡지에 기고 했던 글 중의 일부입니다. 새로 쓰기 귀찮아서 그냥 옛날의 글을 사용하도록 하겠습니다. ************************************************************** TINYINT : 부호있는 수는 -128에서 127까지, 부호 없는 수는 0에서 255까지 표현할 수 있다. 1 바이트 SMALLINT : 부호있는 수는 -32768에서 32767까지, 부호 없는 수는 0에서 65535까지 표현할 수 있다. 2 바이트 MEDIUMINT : 부호있는 수는 -8388608부터 8388607까지, 부호없는 수는 0에서 16777215까지의 수를 표현할 수 있다. 3 바이트 INT : 부호있는 수는 -2147483648부터 2147483647까지, 부호없는 수는 0에서 4294967295까지의 수를 표현할 수 있다. 4 바이트 INTEGER : INT와 같다. BIGINT : 부호있는 수는 -9223372036854775808부터 9223372036854775807 까지의 수를 표현할 수 있고, 부호없는 수는 0부터 18446744073709551615까지 표현할 수 있다. 8바이트 FLOAT : 단일 정밀도를 가진 부동 소수점을 나타낸다. 언제나 부호 있는 수이고, -3.402823466E+38부터 3.402823466E+38까지의 수를 표현할 수 있다. DOUBLE : 2배 정밀도를 가진 부동 소수점 수이다. 언제나 부호있는 수이고, -1.79769313486231517E+308부터 1.7976931348623157E+308까지의 수를 표현할 수 있다. DATE : 날짜를 표현하는 타입으로 '1000-01-01'부터 '9999-12-31'까지를 나타낼 수 있다. 3 바이트 DATETIME : 날짜와 시간을 같이 나타내는 타입이다. '1000-01-01 00:00:00' 부터 '9999-12-31 23:59:59'까지 나타낼 수 있다. 8 바이트 TIMESTAMP: '1970-01-01 00:00:00'부터 2037년까지 나타낼 수 있다. 4 바이트 TIME : 시간을 나타낸다. '-839:59:59'부터 '838:59:59'까지 나타낼 수 있다. YEAR : 년도를 나타낸다. 1901년부터 2155년, 0000년을 나타낼 수 있다. CHAR(M) : 고정 길이를 갖는 문자열을 저장할 수 있다. M은 1부터255까지이다. M이 20이면 20개의 문자를 저장할 수 있다. VARCHAR(M):CHAR는 고정길이인 반면 VARCHAR는 가변 길이이다. 예를 들어 VARCHAR(20)인 컬럼에 10자만 저장을 하면, 실제로도 10자 만큼을 기억장소를 차지한다. 하지만, CHAR는 나머지 10자를 공백으로 매꾼다. TINYBLOB,TINYTEXT : 255개의 문자를 저장할 수 있다. BLOB은 BINARY LARGE OBJECT의 약자이다. BLOB,TEXT : 65535개의 문자를 저장할 수 있다. MEDIUMBLOB, MEDIUMTEXT : 16777215개의 문자를 저장할 수 있다. LONGBLOB,LONGTEXT : 4294967295(4기가)개의 문자를 저장할 수 있다. ************************************************************************ 5.3.2 값이 자동으로 1씩 증가하게 하고 싶은데요. 컬럼의 값을 자동으로 1씩 증가시키는 경우는 매우 많습니다. 간단히 게시판을 생각한다면, 현제 게시물의 경우가 140인데 두 명이 동시에 게시물을 올린다고 생각해 봅시다. 이런 경우 두 글이 모두 141번이 될 수 있기 때문에 , 어느 한쪽에서 먼저 table에 Lock을 거는 방법을 이용하죠. 이런 경우 값을 자동으로 1씩 증가 시킬 수 있다면 편하겠죠? ^^ MySQL에서는 AUTO_INCREMENT를 이용하면 됩니다. 다음의 예를 보죠. mysql> create table test( id int not null auto_increment, > primary key( id ) ) ; mysql> insert into test(NULL) ; mysql> insert into test(NULL) ; mysql> insert into test(NULL) ; mysql> select * from test ; ------- | id | ------- | 1 | | 2 | | 3 | ------- auto_increment를 사용하기 위한 컬럼은 언제나 not null이어야 하고, index이어야 합니다. 5.3.3 AUTO_INCREAMENT는 몬가요? _5.3.2_절을 보시기 바랍니다. 5.3.4 한 컬럼에서 최대 얼마나 저장할 수 있나요? MySQL는 파일 시스템이 지원하는 최대 파일 크기까지의 용량을 저장할 수 있습니다. 리눅스의 경우는 최대 2GB까지 저장할 수 있고, UNIX 계열의 경우는 4GB입니다. 주의하실 점은 MySQL이 다룰 수 있는 데이타의 크기가 2GB혹은 4GB가 아니라는 점입니다. MySQL의 데이타 타입 중 가장 큰 타입은 longtext, longblob으로 4294967295 개의 문자를 저장할 수 있죠. 5.3.5 게시판 등의 본문을 저장하고 싶은데요.. 뭘 써야 하죠? text(65535자), mediumtext(16777215자), longtext(4294967295자) 위의 세 개의 타입 중 원하는 것을 쓰시면 됩니다. 5.4 MySQL에서의 SQL 언어 이 부분은 In the Future에 쓰도록 하겠습니다. http://www.inos.co.kr/wertyu 에 가시면 필자가 예전에 적어 놓은 글들이 있습니다. 급하신 분들은 가서 보시고... 급하지 않으시거나 공부하고 싶으신 분들은 책을 사서 보는게 더 좋습니다. SQL은 기초를 정말 확실히 닦아 놔야 뒤에 가서 고생하지 않습니다. 7. MySQL C API에 관한 질문들 7.1 알파벳 순으로 정리한 각 함수들의 설명을 넣자. 1) my_ulonglong mysql_affected_rows(MYSQL* mysql) INSERT, UPDATE, DELETE 등의 query로 영향을 받은 ROW의 수를 리턴한다. 2) void mysql_close(MYSQL* mysql) 서버와의 연결을 종료한다. 3) void mysql_data_seek(MYSQL_RES* result, unsigned int offset) result에서 임의의 ROW에 접근을 하도록 하는 함수이다. offset이 row의 번호를 나타낸다. 0이면 처음 ROW, mysql_num_rows( result ) - 1 은 마지막 row를 나타낸다. 4) unsigned int mysql_errno(MYSQL* mysql) 가장 최근에 mysql에 일어난 에러의 번호를 리턴한다. 5) char* mysql_error(MYSQL* mysql) 가장 최근에 일어난 에러 메시지를 리턴한다. 6) MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result) 한번 호출할 때마다 한 나의 필드에 대한 정보를 리턴한다. 7) MYSQL_FIELDS* mysql_fetch_fields(MYSQL_RES* result) 배열 형대로 result의 필드에 대한 정보를 한꺼번에 리턴한다. 8) MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL* mysql, MYSQL_FIELD_OFFSET offset) 임의의 필드에 접근을 하도록 한다. 9) MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES* result) 현재 필드의 offset을 리턴한다. 10) void mysql_free_result(MYSQL_RES* result) result에 할당된 메모리를 해제한다. 11) MYSQL* mysql_init(MYSQL* mysql) mysql 객체를 초기화 한다. 인자가 NULL이면 새로운 MYSQL 객체를 생성하고, 초기화 하여 리턴한다. 12) MYSQL_RES* mysql_list_dbs(MYSQL* mysql, const char* wild) 현재 서버에 있는 데이타베이스의 목록을 리턴한다. wild는 MySQL에서 사용할 수 있는 정규식을 나타낸다. result = mysql_list_dbs( &mysql,"%" ) 는 모든 데이타베이스를 리턴하는 예이다.(%는 '모든'을 나타낸다) 13) MYSQL_RES* mysql_list_tables(MYSQL* mysql, const char* wild) 현재 데이타베이스에 있는 테이블들의 목록을 리턴한다. 14) unsigned int mysql_num_fields(MYSQL_RES*result) 혹은 unsigned int mysql_num_fields(MYSQL* mysql) 필드의 수를 리턴한다. 15) my_ulonglong mysql_num_rows(MYSQL_RES* result) result에 총 몇 개의 ROW가 있는지 리턴한다. query 수행 후 mysql_store_result()를 호출하였을 경우에만 사용할 수 있고, mysql_use_result()는 사용할 수 없다. 16) int mysql_ping(MYSQL* mysql) 서버에 연결 중인지를 리턴한다. 연결이 끊어 졌을 경우, 다시 연결을 시도한다. 서버와 연결을 한 후 오랫동안 가만히 있으면 서버가 연결을 끊어버리는데, 이런 경우에 사용한다. 17) int mysql_query(MYSQL* mysql, const char* query) query가 포인트 하는 쿼리를 수행한다. query의 끝은 NULL 문자이다. 성공적으로 query를 수행하였으면 0을 리턴한다. 18) MYSQL* mysql_real_connect(MYSQL* mysql, const char* host, const char* user, const char* passwd, const char* db, uint port, const char* unix_socket, unit client_flag ) host와의 연결을 시도한다. 19) int mysql_real_query(MYSQL* mysql, const char* query, unsigned int length) mysql_query()처럼 query를 수행하나, query의 끝이 legnth인 것이 다르다. 20) MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES* result) 현재 ROW의 offset을 리턴한다. 21) int mysql_select_db(MYSQL* mysql, const char* db) 사용하고자 하는 database를 변경한다. mysql_query()를 이용하여 "use db이름" 의 query를 수행해도 같은 결과를 얻는다. 22) int mysql_shutdown(MYSQL* mysql) 서버를 종료시킨다. 현재 사용자에게 shutdown 권한이 있어야 한다. 23) MYSQL_RES* mysql_store_result(MYSQL* mysql) query의 수행 결과를 서버로부터 한 번에 모두 받아 온다. 24) MYSQL_RES* mysql_use_result(MYSQL* mysql) query의 수행 결과를 서버로부터 한 개의 ROW 씩 받아 온다. 7.2 간단한 예를 얻을 수 없을까요? 가끔씩 MySQL의 메일링 리스트에 같은 질문이 올라 옵니다. 그런 질문에 대한 답변을 보면 모두, MySQL의 Client 프로그램인 mysql의소스를 보라고 하죠. ^^ 맞는 말입니다. mysqleh C API를 이용해서 만들었습니다. 하지만 저는 이런 식의 답변을 무지 싫어 합니다. 아주 간단한 소스는 바로 밑에 있습니다. 소스의 원본이나 MySQL의 C API에 대한 더욱 자세한 설명은 http://www.inos.co.kr/wertyu를 방문하시면 됩니다. *********************************************************** 1: #include 2: #include 3: #include 4: 5: void main(void) 6: { 7: MYSQL mysql ; 8: MYSQL_RES* res ; 9: MYSQL_ROW row ; 10: int fields ; 11: 12: mysql_init(&mysql) ; 13: 14: if(!mysql_real_connect(&mysql, NULL, "사용자","암호", "test" ,3306, (char *)NULL, 0)) 15: { 16: printf("%s\n",mysql_error(&mysql)); 17: exit(1) ; 18: } 19: 20: if(mysql_query(&mysql, "USE super") ) // mysql_query()는 query 수행시에 에러가 나게 되면 // 0이 아닌 값을 리턴한다. { printf("%s\n", mysql_error(&mysql) ; exit(1) ; } 21: if(mysql_query(&mysql, "SELECT * FROM dome") ) { printf("%s\n", mysql_error(&mysql) ; exit(1) ; } 22: 23: res = mysql_store_result( &mysql ) ; 24: fields = mysql_num_fields(res) ; 25: 26: while( ( row = mysql_fetch_row( res ) )) 27: { 28: for( cnt = 0 ; cnt < fields ; ++cnt) 29: printf("%12s ", row[cnt]) ; 30: 31: printf("\n") ; 32: } 33: 34: mysql_free_result( res ) ; 35: mysql_close(&mysql) ; 36: } *****************************************************