23.8.9 C API Prepared Statement Data 구조
Prepared Statement은 일부 데이터 구조를 사용합니다.
명령문 핸들을 얻으려면,
MYSQL연결 처리기를mysql_stmt_init()에 전달합니다. 이것은MYSQL_STMT데이터 구조에 포인터를 반환합니다. 이 구조는 문의 후속 처리에 사용됩니다. Prepared Statement를 지정하려면MYSQL_STMT포인터와 문 문자열을mysql_stmt_prepare()에 전달합니다.Prepared Statement의 입력 매개 변수를 제공하려면
MYSQL_BIND구조를 설정하여 그들을mysql_stmt_bind_param()에 전달합니다. 출력 컬럼 값을 받으려면,MYSQL_BIND구조를 설정하고이를mysql_stmt_bind_result()에 전달합니다.MYSQL_TIME구조는 양방향으로 시간 데이터를 전송하는 데 사용됩니다.
다음의 설명에서는 Prepared Statement 데이터 형식을 자세히 설명합니다. 그 사용 방법에 대한 예는 섹션 23.8.11.10 "mysql_stmt_execute ()" 및 섹션 23.8.11.11 "mysql_stmt_fetch ()" 를 참조하십시오.
MYSQL_STMT이 구조는 Prepared Statement 핸들입니다. 핸들을 작성하려면
mysql_stmt_init()를 호출합니다. 이것은MYSQL_STMT에 대한 포인터를 반환합니다. 핸들은mysql_stmt_close()로 닫기 (그 시점에서 핸들이 무효가됩니다)까지 다음의 모든 문 작업에 사용됩니다.MYSQL_STMT구조는 응용 프로그램에서 사용하는 것이 의도 된 회원이 없습니다. 응용 프로그램은MYSQL_STMT구조를 복사하려고하지 마십시오. 그와 같은 자료를 사용할 수 보장 할 수 없습니다.여러 문 핸들을 하나의 연결에 연결할 수 있습니다. 핸들 제한은 사용 가능한 시스템 리소스에 따라 다릅니다.
MYSQL_BIND이 구조는 명령문 입력 (서버에 전송되는 데이터 값)과 출력 (서버에서 반환 된 결과 값) 모두에 사용됩니다.
입력의 경우
mysql_stmt_bind_param()에서MYSQL_BIND구조를 사용하여 매개 변수 데이터 값을mysql_stmt_execute()에서 사용하기 위해 버퍼에 바인딩합니다.출력의 경우는
mysql_stmt_bind_result()에서MYSQL_BIND구조를 사용하여mysql_stmt_fetch()에 의해 행 페치에서 사용하기 위해 버퍼를 결과 집합 열에 바인딩합니다.
MYSQL_BIND구조를 사용하려면 그 내용을 제로로 초기화 한 후 그 멤버를 적절하게 설정합니다. 예를 들어, 3 개의MYSQL_BIND구조의 배열을 선언하고 초기화하려면이 코드를 사용합니다.MYSQL_BIND bind [3]; memset (bind, 0, sizeof (bind));
MYSQL_BIND구조는 어플리케이션 프로그램에서 사용하는 다음 멤버가 포함됩니다. 일부 구성원에 대해 사용하는 방법은 구조가 입력에 사용되거나 출력에 사용되는지에 따라 다릅니다.enum enum_field_types buffer_type버퍼의 종류. 이 멤버는 문 매개 변수 또는 결과 세트 컬럼에 바인딩되어있는 C 언어 변수의 데이터 형식을 나타냅니다. 입력의 경우,
buffer_type은 서버로 전송되는 값을 저장하는 변수의 형태를 나타냅니다. 출력의 경우, 그것은 서버에서받은 값을 저장해야 할 변수 유형을 나타냅니다. 허용되는buffer_type값은 섹션 23.8.9.1 "C API Prepared Statement 유형 코드" 를 참조하십시오.void *buffer데이터 전송에 사용되는 버퍼의 포인터. 이것은 C 언어 변수의 주소입니다.
입력의 경우
buffer는 문 매개 변수의 데이터 값을 저장하는 변수에 대한 포인터입니다.mysql_stmt_execute()를 호출하면, MySQL은 문에서 해당 매개 변수 마커 (문 문자열에?로 지정되는) 대신에 변수에 저장되어있는 값을 사용합니다.출력의 경우,
buffer는 결과 세트 컬럼 값을 반환하는 변수에 대한 포인터입니다.mysql_stmt_fetch()를 호출하면, MySQL은 결과 세트의 현재 행의 열 값을 변수에 저장합니다. 호출이 돌아 오면 값에 액세스 할 수 있습니다.MySQL은 클라이언트 측의 C 언어 값과 서버 측의 SQL 값 사이의 유형 변환을 수행 할 필요성을 최소화하려면 해당 SQL 값의 형태와 유사한 형태를 가지는 C 변수를 사용합니다.
숫자 데이터 형식의 경우
buffer는 정확한 수치 C 형의 변수를 가리키는해야합니다. 정수 변수 (이것은 단일 바이트 값의 경우char또는 큰 값의 경우 정수를 지정할 수 있습니다)의 경우, 후술하는is_unsigned멤버를 설정하여 변수를unsigned속성을 가질 지 어떨지도 지정 바랍니다.문자 (비 바이너리) 및 이진 문자열 데이터 형의 경우,
buffer는 문자 버퍼를 가리 키도록하십시오.날짜 및 시간 데이터 유형의 경우,
buffer는MYSQL_TIME구조를 가리 키도록하십시오.
C 형과 SQL 형 간의 매핑 지침 및 형식 변환에 관한주의 사항은 섹션 23.8.9.1 "C API Prepared Statement 유형 코드" 및 섹션 23.8.9.2 "C API Prepared Statement 형 변환" 을 참조하십시오.
unsigned long buffer_length*buffer의 바이트의 실제 크기입니다. 이것은 버퍼에 저장할 수있는 최대 데이터 양을 나타냅니다. 문자 및 바이너리 C 데이터의 경우buffer_length값은 입력 값을 지정하는mysql_stmt_bind_param()와 함께 사용했을 때*buffer의 길이 또는mysql_stmt_bind_result()와 함께 사용하면 버퍼에 가져올 수 출력 데이터 바이트의 최대 수를 지정합니다.unsigned long *length*buffer에 저장된 데이터의 실제 바이트 수를 나타내는unsigned long변수에 대한 포인터.length는 문자 또는 이진 C 데이터에 사용됩니다.입력 파라미터 데이터 바인딩의 경우
*buffer에 저장된 파라미터 값의 실제 길이를 같이*length를 설정합니다. 이것은mysql_stmt_execute()에서 사용됩니다.출력 값 바인딩의 경우,
mysql_stmt_fetch()를 호출 할 때, MySQL에 의해*length가 설정됩니다.mysql_stmt_fetch()의 반환 값에 의해 길이의 해석 방법을 결정합니다.반환 값이 0 인 경우
*length는 파라미터 값의 실제 길이를 나타냅니다.반환 값이
MYSQL_DATA_TRUNCATED의 경우*length는 파라미터 값 잘림되지 않은 길이를 나타냅니다. 이 경우,*length과buffer_length의 최소 값의 실제 길이를 나타냅니다.
buffer_type값에 따라 데이터 값의 길이가 결정되기 때문에length는 숫자와 시간 데이터 형에 대해서는 무시됩니다.반환 값의 길이를 페치하기 전에 확인해야 할 경우 몇 가지 전략에 대한 섹션 23.8.11.11 "mysql_stmt_fetch ()" 를 참조하십시오.
my_bool *is_null이 멤버는 값이
NULL의 경우에 true로, 그것이NULL이 아닌 경우 false 인my_bool변수를 지시합니다. 입력은*is_null를 true로 설정하여 문 매개 변수로NULL값을 전달하는 것을 나타냅니다.is_null은 boolean 스칼라 포인터에NULL값 지정 방법의 유연성을 제공합니다.데이터 값이 항상
NULL이면 열 바인딩시buffer_type값으로MYSQL_TYPE_NULL을 사용합니다.is_null을 포함한 다른MYSQL_BIND멤버는 중요하지 않습니다.데이터 값이 항상
NOT NULL이면,is_null = (my_bool*) 0을 설정하고 바인딩 변수에 적절하게 다른 멤버를 설정합니다.다른 모든 경우에 다른 멤버를 적절하게 설정하고
is_null에my_bool변수의 주소를 설정합니다. 실행과 실행 사이에 그 변수의 값을 true 또는 false로 적절하게 설정하여 해당 데이터 값이 각각NULL이거나NOT NULL인지를 나타냅니다.
출력의 경우 행을 인출하면 MySQL은 문에서 반환 된 결과 세트 컬럼 값이
NULL인지 여부에 따라is_null에서 지시되는 값을 true 또는 false로 설정합니다.my_bool is_unsigned이 멤버는
unsigned(char,short int,int,long long int)를 지정된 유형을 가진 C 변수에 적용됩니다.buffer에 의해 지시되는 변수가unsigned의 경우is_unsigned를 true로 설정하고 그렇지 않으면 false로 설정합니다. 예를 들어,signed char변수를buffer에 바인드 할 경우MYSQL_TYPE_TINY유형 코드를 지정하고is_unsigned를 false로 설정합니다. 대신에unsigned char를 바인드하는 경우, 타입 코드는 동일하지만is_unsigned를 true로하십시오. (char의 경우 그것은 부호 첨부 나 부호 없음인지 정의되지 않기 때문에signed char와unsigned char를 사용하여 부호의 유무를 명시하는 것이 좋습니다.)is_unsigned는 클라이언트 측의 C 언어 변수에만 적용됩니다. 그것은 서버 측의 대응하는 SQL 값의 부호의 유무에 대해서는 아무것도 나타내지 않습니다. 예를 들어,int변수를 사용하여BIGINT UNSIGNED컬럼의 값을 제공하는 경우int는 부호있는 형태이기 때문에is_unsigned는 false로해야합니다.unsigned int변수를 사용하여BIGINT컬럼의 값을 제공하는 경우,unsigned int는 부호없는 형식이기 때문에is_unsigned를 true로해야합니다. MySQL은 부호있는 값과 부호없는 값으로 양방향으로 올바른 변환을 수행하지만 잘림이 발생하면 경고가 생성됩니다.my_bool *error출력의 경우,이 멤버를
my_bool변수를 가리 키도록 설정하고 행 페 다음에는 거기에 포함되는 파라미터 잘림 정보를 보유하고 있습니다. 잘린 보고서를 사용하면mysql_stmt_fetch()는MYSQL_DATA_TRUNCATED을 돌려 절단이 발생한 파라미터의MYSQL_BIND구조에서*error가 true가됩니다. 잘라내 기는 부호 또는 자리 빠짐 또는 문자열이 너무 길어서 컬럼에 들어 가지 않았 음을 나타냅니다. 잘린 보고서는 기본적으로 활성화되어 있지만MYSQL_REPORT_DATA_TRUNCATION옵션을 사용하여mysql_options()를 호출하여 제어 할 수 있습니다.
MYSQL_TIME이 구조는
DATE,TIME,DATETIME, 그리고TIMESTAMP데이터를 직접 서버와주고받는 데 사용됩니다.buffer멤버를MYSQL_TIME구조를 가리 키도록 설정하고MYSQL_BIND구조의buffer_type멤버 중 하나 시간 형 (MYSQL_TYPE_TIME,MYSQL_TYPE_DATE,MYSQL_TYPE_DATETIME,MYSQL_TYPE_TIMESTAMP)로 설정합니다.MYSQL_TIME구조는 다음 표에 나와있는 멤버가 포함됩니다.회원 설명 unsigned int year년 unsigned int month달 unsigned int day하루 unsigned int hour시간 unsigned int minute분 unsigned int second초 my_bool neg시간이 부인지 여부를 나타내는 boolean 플래그 unsigned long second_part밀리 초 단위로 소수 단위 초 (MySQL 5.6.4 이전 버전에서는 미사용) 시간 값의 지정된 형식에 적용하는
MYSQL_TIME구조의 부분 만 사용됩니다.year,month, 그리고day요소는DATE,DATETIME, 그리고TIMESTAMP값에 사용됩니다.hour,minute및second요소는TIME,DATETIME, 그리고TIMESTAMP값에 사용됩니다. 섹션 23.8.19 "C API Prepared Statement 일시 치 처리" 를 참조하십시오.