2009년 1월 20일 화요일

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

Field Packet
Field Packet에서는 컬럼정보가 반환된다.  구체적으로는 컬럼명, 컬럼명의 Alias,컬럼이 속해있는 테이블명, 데이터베이스명, 캐릭터셋, 표시길이, 데이터형, 정합성제약등이 포함된다. 
하나의 컬럼이 하나의 Field Packet에 대응된다. 

카타로그명은 현재 「def」라는 문자열로 고정되어 있다. Length Coded String이므로 문자열 크기를 나타내는 1바이트가 선두에 붙어서 합계 4바이트가 된다. 

데이터베이스명, 테이블명의 alias, 테이블명, 컬럼의 alias, 컬럼명도 같은 형태로 Length Coded String 표기로 반환된다. 

표시길이라는 것은 명령어라인툴 mysql등에서 컬럼값이 화면에 표시될 때의 폭에 사용된다. 
INTEGER형이라면 기본값으로 INT(11)로 정의되고 이 경우 화면표시 폭은 11이다. 
이럴 때  0x0b(11)이 반환된다. 

데이터형은 문자그대로 컬럼의 데이터형을 말한다. 
CHAR/VARCHAR/TINYTEXT...등의 어플리케이션에서 지정하는 데이터형하고는 다소 다른 분류를 가지고 있다. 

데이터형 특성이라는 것은  유일(UNIQUE) 키 제약이 있는지 없는지 , NOT NULL제약이 있는지 어떤지 등의 정보를 말한다. 
정합성제약이외에도 대문자, 소문자를 구별하는 BINARY속성이 있는지 어떤지 하는 정보도 포함된다. 
이외에도 DECIMAL형의 경우에는 정도(스케일)를 나타내는 정보도 반환된다. 

또, 이 패킷은 한개의 패킷이 완료될 때마다 반환되는 것이 아니다.  그런 무식한 코딩을 할 이유가 없기 때문이다. 
당연하지만 버퍼에 쌓여 서버측 처리가 완결된 시점이나 버퍼가 꽉 찼을 때에 비로소 처음으로 클라이언트에 보내진다. 이것은 다른 패킷도 마찬가지이다. 

*Field Packet
패킷헤더: 4바이트
카타로그명: LCS(4바이트고정), 현재는 def고정(문자열크기+ def)합계 4바이트
데이터베이스명:LCS, 문자열크기+ 데이터베이스명 
데이블명의 alias: LCS, 문자열크기+데이블명의 alias
테이블명: LCS, 문자열크기 + 원래의 테이블명
컬럼명의 alias: LCS, 문자열크기 + 컬럼명의 alias
컬럼명: LCS, 문자열크기+ 원래의 컬럼명
filler:1바이트 , 0x0c고정
캐릭터셋번호: 2바이트, 16진수의 정수표현
표시길이: 4바이트, 화면표시길이 
데이터형: 1바이트, 컬럼의 데이터형
데이터형특성: 2바이트, xx_FLAG
Decimal형의 스케일: 1바이트,  Decimal형이 아닌 경우에는 0x00
filler: 2바이트, 0x00 00고정
기본값: LCS, 기본값제약의 값. COM_FIELD_LIST명령어를 수신했을 경우에 한해서 부가되어짐.

*데이터형의 종류
MYSQL_TYPE_DECIMAL   0(10진수)
MYSQL_TYPE_TINY 1(10진수)
MYSQL_TYPE_SHORT 2(10진수)
MYSQL_TYPE_LONG 3(10진수)
MYSQL_TYPE_FLOAT 4(10진수)
MYSQL_TYPE_DOUBLE 5(10진수)
MYSQL_TYPE_NULL 6(10진수)
MYSQL_TYPE_TIMESTAMP 7(10진수)
MYSQL_TYPE_LONGLONG 8(10진수)
MYSQL_TYPE_INT24 9(10진수)
MYSQL_TYPE_DATE 10(10진수)
MYSQL_TYPE_TIME 11(10진수)
MYSQL_TYPE_DATETIME 12(10진수)
MYSQL_TYPE_YEAR 13(10진수)
MYSQL_TYPE_NEWDATE 14(10진수)
MYSQL_TYPE_VARCHAR 15(10진수)
MYSQL_TYPE_BIT 16(10진수)
MYSQL_TYPE_NEWDECIMAL 246(10진수)
MYSQL_TYPE_ENUM 247(10진수)
MYSQL_TYPE_SET 248(10진수)
MYSQL_TYPE_TINY_BLOB 249(10진수)
MYSQL_TYPE_MEDIUM_BLOB 250(10진수)
MYSQL_TYPE_LONG_BLOB 251(10진수)
MYSQL_TYPE_BLOB 252(10진수)
MYSQL_TYPE_VAR_STRING 253(10진수)
MYSQL_TYPE_STRING 254(10진수)
MYSQL_TYPE_GEOMETRY 255(10진수)

*데이터형특성의 종류
NOT_NULL_FLAG 2^0 NOT NULL
PRI_KEY_FLAG 2^1 주키의 일부
UNIQUE_KEY_FLAG 2^2 유일(UNIQUE)키의 일부
MULTIPLE_KEY_FLAG 2^3 멀티컬럼인텍스를 구성함
BLOB_FLAG 2^4 BLOB형
UNSIGNED_FLAG 2^5 UNSIGNED형
ZEROFILL_FLAG 2^6 0으로 채움
BINARY_FLAG 2^7 BINARY형
ENUM_FLAG 2^8 ENUM형
AUTO_INCREMENT_FLAG 2^9 AUTO_INCREMENT
TIMESTAMP_FLAG 2^10 TIMESTAMP형
SET_FLAG 2^11 SET형
NO_DEFAULT_VALUE_FLAG 2^12 DEFAULT제약이 없음
NUM_FLAG 2^15 NUMERIC형