可変長文字データ (列名、動的パラメーター、文字列属性値など) を参照する入力パラメーターには、長さパラメーターが関連付けられています。 C の一般的なように、アプリケーションが null 文字で文字列を終了する場合は、文字列の長さ (null ターミネータを含まない) または SQL_NTS (Null-Terminated String) のどちらかを引数として提供します。 負以外の長さの引数は、関連付けられた文字列の実際の長さを指定します。 長さ 0 の文字列を指定する場合は、長さ引数 0 を指定できます。これは NULL 値とは異なります。 負の値SQL_NTSは、ドライバーにヌル終端文字を見つけ、文字列の長さを決定するよう指示します。
ドライバーからアプリケーションに文字データが返される場合、ドライバーは常に 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 文字をバイナリ データとして含めることができる文字データを常に処理する必要があります。