2010년 12월 27일 월요일

MySQL ErrorNo와 SqlState 는 무엇을 의미할까?


PHP나 JDBC로 MySQL 데이터베이스를 이용하는 프로그램을 작성하다 보면 ErrorNo와 SqlState라는 말이나 값들을 자주 접하게 된다.
그러면, "왜 MySQL은 에러나 상태 코드를 이렇게 ErrorNo와 SqlState라는 것으로 따로 분리해서 사용할까"라는 의문이 들 것이다.
이 글에서는 ErrorNo와 SqlState의 차이점과 대표적인 ErrorNo와 SqlState값을 확인 해보자.

mysql> SELECT * FROM not_found_table;
ERROR 1146 (42S02): Table 'test.not_found_table' doesn't exist

위의 예제에서와 같이 mysql client를 이용해서 쿼리를 실행하면, 에러나 경고 발생시에 콘솔에 
"ERROR ${ERROR-NO} (${SQL-STATE}): ${ERROR-MESSAGE}"
와 같은 형태의 결과물을 확인할 수 있다. 각 부분의 출력 값들의 의미는 아래와 같다. 이런 ErrorNo나 SqlState값은 기본적인 프로그램 작성뿐만 아니라 MySQL의 Stored program (Procedure, Function, Trigger)을 작성할 때 예외 처리를 위해서도 반드시 알아야 할 내용이기도 하다.

* ${ERROR-NO}
4
자리 (현재까지는) 숫자 값으로 구성된 에러 코드이며, 이 에러 코드 값은 MySQL에서만 유효한 에러 식별 번호이다. 즉,  1146이라는 에러 코드 값은 MySQL에서는 "테이블이 존재하지 않는다"라는 것을 의미하지만, 다른 DBMS 벤더에서는 다른 의미로 사용될 수 있다는 것을 의미한다. (또한 다른 DBMS 벤더에서는 다른 형태로 에러 코드가 구성되어 있을 수도 있다.)
* ${SQL-STATE}
5
글자의 Alpha-Numeric 으로 구성되며, 에러뿐만 아니라 여러 가지 상태를 의미하는 코드로써, 이 값은 DBMS 종류가 다르다 하더라도 ANSI SQL 표준을 준수하는 DBMS (ODBC, JDBC 포함)에서는 모두 동일한 값을 가지고 된다. 즉 이 값은 표준 값으로 정의되기 때문에 DBMS  벤더에 의존적이지 않다. 대 부분의 ErrorNo는 특정 SqlState값과 매핑이 되어 있으며, 그 이외의 매핑되지 않는 ErrorNo의 경우에는 SqlState 값이 "HY000" (General error)으로 설정된다.
SqlState
값의 앞 2글자는 아래와 같은 의미를 가지고 있다.
- "00"
정상 처리됨
- "01"
경고 메시지 (Warning)
- "02" Not found (SELECT
나 Cursor 에서 결과가 없는 경우에만 사용됨)
-
그 이외의 값들은 각자의 에러 케이스들을 의미한다.
* ${ERROR-MESSAGE}포맷팅된 텍스트 문장으로, Human readable한 에러 메시지이다. 이 정보 또한 DBMS 벤더 별로 내용이나 구조가 다르다.

MySQL의 ErrorNo와 SqlState 및 Error message의 목록은 아래 링크에서 확인
http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html 

 
SqlState와 ErrorNo의 예제를 몇 개 살펴보자.

경고
    Error: 1262 SQLSTATE: 01000 (ER_WARN_TOO_MANY_RECORDS)
    Message: Row %ld was truncated; it contained more data than there were input columns

NotFound
    Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
    Message: No data - zero rows fetched, selected, or processed

그 외 에러
    Error: 1061 SQLSTATE: 42000 (ER_DUP_KEYNAME)
    Message: Duplicate key name '%s'

댓글 없음:

댓글 쓰기