2009년 2월 1일 일요일

Prepared Statement의 패킷4

Placeholder(「?」)에 값을 넣어, 실제로 SQL문을 실행시키는 단계(C에서는 mysql_stmt_execute()에 해당)에서는 Execute명령용 패킷이 송수신된다. 

Execute Command Packet
클라이언트에서 서버로 보내지는 패킷이다. 
placeholder의 데이터형과 설정값등의 정보가 보내지게 된다. 

 Execute Command Packet
패킷헤더: 4바이트
명령번호 : 1바이트 , execute이면 0x17(COM_STMT_EXECUTE)
 Statement ID: 4바이트
 flag(커서타입): 1바이트, 서버측 커서(STMT_ATTR_CURSOR_TYPE)기능을 사용하는 경우는 0x01, 그 이외에는 0x00
 카운터: 4바이트, 현재는 0x01 00 00 00 의 4바이트 고정
 null bit map: (7+파라미터  갯수)/8 바이트,  바인드 변수가 null을 허용할까 말까의 플래그
 send_types_to_server: 1바이트, 현재는 0x01고정
 placeholder의 데이터형: 2*n바이트,  placeholder의 갯수만큼 반복  ex> 03 00 fd 00
 placeholder의  값:  수치는 바이너리표기, 문자열, 날짜/시간형은 LCS표기
   ex>03 00 00 00 03 61 62 63  
     ==>  첫번째 placeholder : 4바이트 integer형, 값은 3   
               두번째 placeholder: 문자열 abc


명령번호는 0x17(COM_STMT_EXECUTE)이다. 

커서타입이라는 것은 MySQL5.0이후의 기능인 서버측 커서를 사용할까 아닐까하는 것을 표시하는 플래그로 사용하지 않는 경우에는 0x00 사용하는 경우에는 0x01이 된다. 

현시점의 MySQL의 서버측 커서는 읽기 전용이기 때문에 서버측 커서기능을 사용할지 않을까(0x00),  읽기 전용 서버사이트 커서기능을 사용할까(0x01) 의 두가지 선택이 가능하게 된다. 

디폴트로는 서버측 커서기능은 off이다. 
또 Prepared Statement기능을 병용사용할 필요가 있어서  보통의 SQL문하고 세트로 사용하는 것은 되지는 않는다. 

null bit map이라는 것은 각 Placeholder가 null값을 허용할까 말까를 식별하기위한 플래그이다. 
최후에 각 Placeholder의 데이터형하고 Placeholder의 설정값이 각각 반복되어 저장된다. 
데이터형은 일률 2바이트로 관리된다.  
Placeholder의 설정값은,  문자열형은 Length Coded String표기이지만 수치형은 16진수표기가 되는 등 데이터형에 따라서 다르다. 

갱신할 때에는 보통 갱신용 SQL문장의 경우와 같이 서버에서 클라이언트에 OK/Error Packet이 반환된다.  또  검색할때도 보통 검색용 SQL문과 같이 서버에서 클라이언트로 다음과 같은 구성으로 패킷이 반환된다. 

ResultSet Header Packet 1패킷
Field Packets 컬럼수만큼의 패킷
EOF Packet  1패킷
PreparedStatement Row Data Packets  레코드수만큼의 패킷
EOF Packet 1패킷

이 중에 Rows Data Packets만 레이아웃이 보통의 검색용 SQL문의 경우와 다르다.