2010년 12월 27일 월요일

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


PHP JDBCMySQL 데이터베이스를 이용하는 프로그램을 작성하다 보면 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'

댓글 없음:

댓글 쓰기