레이블이 mysql패킷인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mysql패킷인 게시물을 표시합니다. 모든 게시물 표시

2009년 1월 28일 수요일

Prepared Statement의 패킷3

Placeholder Packet
Placeholder Packet에는 placeholder에 관한 정보가 들어있다. 
이 레이아웃은 현재에는 Field Packet하고 같은 구성으로 되어있다. 
그렇지만 아래와 같이 거의가 고정값으로 되어있다. 

Placeholder Packet
패킷헤더: 4바이트
카탈로그명: LCS(4바이트고정)    ex> 0x03 64 65 66("def") 고정
데이터베이스명: LCS(1바이트고정)  , 0x00고정
데이터베이스명: LCS(1바이트고정)  , 0x00고정
테이블명의 Alias:  LCS(1바이트 고정), 0x00고정
테이블명: LCS(1바이트고정), 0x00고정
컬럼명의 Alias: LCS(2바이트고정) ex>0x01  3f 고정
컬럼명: LCS(1바이트고정) , 0x00고정
 filler:1바이트, 0x0c고정
캐릭터셋번호: 2바이트, 0x3f 00고정
표시크기: 4바이트, 0x00 00 00 00 고정
데이터형: 1바이트, 0xfd고정
데이터형특성: 2바이트, 0x80 00(BINARY)고정
 Decimal형의 스케일: 1바이트, 0x00고정( Decimal형이어도 0x00고정)
 filler: 2바이트, 0x00 00고정

※Field Packet하고 기본적으로 같은 포맷

EOF Packet하고 FieldPacket의 구성은 보통 검색용 SQL문의 경우하고 같다. 
갱신용 SQL문의 경우에는 Placeholder Packet다음에 그냥 EOF Packet으로 끝난다.


Prepared Statement의 패킷2

Prepare Header Packet
Prepare 명령을  올바르게 수신했다라는 신호로써 선두 1바이트는 0x00이 된다. 
statement ID라는 것은 Prepared statement오브젝트를 유일하게 식별하기 위한 번호이다. 
이후의 Prepared statement처리에는 클라이언트와 서버의 사이에 이 statement ID가 주고받게 되는 것이다. 

컬럼수는 실행하는 SQL문이 반환하는 컬럼 수를 말한다. 
이 값이 Field Packet의 수하고 일치하게 된다. 
이것은 Result Set Header Packet하고도 같다.  
갱신용의 경우 결과셋을 반환하지 않기 때문에 0(0x00)이 된다. 

PlaceHolder수는 SQL문중에 지정한 placeholder(「?」)의 수가 몇개있는지 나타내고 있다. 
이 수는 앞으로 이야기하게 될 Placeholder Packet의 수하고 일치한다. 

Prepare Header Packet
패킷헤더: 4바이트
OK통지: 1바이트 , 0x00고정
statement ID: 4바이트,  mysqld내부에 관리하고 있는 Prepared statement오브젝트를 유일하게 식별하기 위한 번호
컬럼수: 2바이트, 반환하는 컬럼수
placeholder수: 2바이트
filler: 1바이트, 0x00고정
경고수: 2바이트


2009년 1월 22일 목요일

검색용 SQL문 실행시의 패킷4

EOF Packet
컬럼수만큼의 Field Packet뒤에 EOF Packet이 보내어진다. 
이것은 OK Packet하고 비숫하지만 패킷헤더 직후의 값이  0xfe로 고정되어 있는 점, affected rows하고 insert_id가 없는점, Warning Count하고 Server Status의 순서가 어떤이유에서인지 뒤바뀌어 있다는 점이 다르다. 

EOF Packet
패킷헤더: 4바이트
Field Count:1바이트, 0xfe고정
Warning Count: 2바이트
Status Flags: 2바이트

Row Data Packet
Row Data Packet에는 컬럼값의 정보가 포함되어 있다. 
컬럼값은 Length Coded String표현이다. 이것은  수치형이어도, 날짜/시각형, 바이너리형이어도 같다. 
Row Data Packet1패킷은 1레코드에 해당된다. 
1패킷안에 컬럼수만큼의 정보가 반복포함되어 있다. 

나중에 설명하게 되는 Prepared Statement의 경우에도 검색용 처리라면 같은 형식으로 Row Data Packet을 반환하지만 포맷이 약간 다르다. 

레코드수 만큼의 Row Data Packet이 보내어진 다음에 EOF Packet이 1바이트 추가된다. 
여기에서 검색용 패킷은 완료되고 OK Packet은 사용되지 않는다. 

또 SQL구문에러등이 발생한 경우에는 검색용 패킷 대신에 Error Packet이 보내어진다. 

Row Data Packet
패킷헤더: 4바이트
컬럼수 : LCS   , 문자열크기+컬럼값 (수치여도 LCS표기)
*첫번째컬럼값이 「1」,  두번째 컬럼이 「abc」, 세번째 컬럼이 「2008-12-30 16:18:17」 인 경우 패킷예   
01 31 03 61 62 63 13 32 30 30 38 2d 31 32 2d 33 30 20 31 36 3a 31 38 3a 31 37