다음을 통해 공유


문자 데이터 및 C 문자열

가변 길이 문자 데이터(예: 열 이름, 동적 매개 변수 및 문자열 특성 값)를 참조하는 입력 매개 변수에는 연결된 길이 매개 변수가 있습니다. 애플리케이션이 C에서 일반적인 것처럼 null 문자로 문자열을 종료하는 경우 문자열의 길이(null 종결자 포함 안 됨) 또는 SQL_NTS(Null로 종료된 문자열)의 길이(바이트)를 인수로 제공합니다. 음수가 아닌 길이 인수는 연결된 문자열의 실제 길이를 지정합니다. 길이 인수는 NULL 값과 구별되는 길이가 0인 문자열을 지정하기 위해 0일 수 있습니다. SQL_NTS 음수 값은 드라이버가 null 종료 문자를 찾아 문자열의 길이를 결정하도록 지시합니다.

드라이버에서 애플리케이션으로 문자 데이터가 반환되면 드라이버는 항상 null로 종료해야 합니다. 이렇게 하면 애플리케이션에서 데이터를 문자열 또는 문자 배열로 처리할지 여부를 선택할 수 있습니다. 애플리케이션 버퍼가 모든 문자 데이터를 반환할 만큼 충분히 크지 않은 경우 드라이버는 해당 데이터를 버퍼의 바이트 길이로 잘라 null 종료 문자에 필요한 바이트 수를 줄이고, 잘린 데이터를 null로 종료하고, 버퍼에 저장합니다. 따라서 애플리케이션은 항상 문자 데이터를 검색하는 데 사용되는 버퍼에서 null 종료 문자에 대한 추가 공간을 할당해야 합니다. 예를 들어 50자의 데이터를 검색하려면 51 바이트 버퍼가 필요합니다.

SQLPutData 또는 SQLGetData를 사용하는 부분에서 긴 문자 데이터를 보내거나 검색할 때 애플리케이션과 드라이버가 특별히 주의해야 합니다. 데이터가 일련의 null로 끝나는 문자열로 전달되는 경우 데이터를 다시 조립하기 전에 이러한 문자열의 null 종료 문자를 제거해야 합니다.

많은 ODBC 프로그래머가 문자 데이터와 C 문자열을 혼동했습니다. 이 문제가 발생한 것은 ODBC 함수를 정의할 때 C 언어를 사용하는 아티팩트입니다. ODBC 드라이버 또는 애플리케이션이 다른 언어를 사용하는 경우 - ODBC는 언어 독립적이라는 것을 기억하십시오. 이러한 혼란은 발생할 가능성이 적습니다.

C 문자열을 사용하여 문자 데이터를 보유하는 경우 null 종료 문자는 데이터의 일부로 간주되지 않으며 바이트 길이의 일부로 계산되지 않습니다. 예를 들어 문자 데이터 "ABC"는 C 문자열 "ABC\0" 또는 문자 배열 {'A', 'B', 'C'}로 보유할 수 있습니다. 데이터의 바이트 길이는 문자열 또는 문자 배열로 처리되는지 여부에 관계없이 3입니다.

애플리케이션과 드라이버는 일반적으로 C 문자열(null로 끝나는 문자 배열)을 사용하여 문자 데이터를 보유하지만 이 작업을 수행할 필요가 없습니다. C에서 문자 데이터는 문자 배열(null 종료 제외)으로 처리되고 길이/표시기 버퍼에서 바이트 길이가 별도로 전달될 수도 있습니다.

문자 데이터는 null로 종료되지 않은 배열에 보관할 수 있고 바이트 길이는 별도로 전달되므로 문자 데이터에 null 문자를 포함할 수 있습니다. 그러나 이 경우 ODBC 함수의 동작은 정의되지 않으며 드라이버가 이를 올바르게 처리하는지 여부에 따라 다릅니다. 따라서 상호 운용 가능한 애플리케이션은 항상 포함된 null 문자를 이진 데이터로 포함할 수 있는 문자 데이터를 처리해야 합니다.