準備されたステートメントにはいくつかのデータ構造が使われます:
ステートメントを準備するため、ステートメントストリングをmysql_stmt_init()をに渡してください。
これによって、ポインターがMYSQL_STMTに戻されます。
インプットパラメータを準備されたステートメントに規定するには、MYSQL_BIND構造を設定して、それをmysql_stmt_bind_param()に渡してください。アウトプットカラムを受け取るには、MYSQL_BINDを設定して、これをmysql_stmt_bind_result()に渡してください。
MYSQL_TIME構造は一時データを両方向に転送するために使われます。
次の講義で、準備されたステートメントのデータタイプを詳細に説明します。
この構造は準備されたステートメントを表します。ステートメントはmysql_stmt_init()を呼び出すことによって生成され、これによって、ステートメントハンドル(即ちMYSQL_STMT>)が戻され
ます。ハンドルは、それをmysql_stmt_close()を使って選択するまで、そのステートメントを使った後のオペレーションに使われます。
MYSQL_STMT構造には、アプリケーションに使うよう意図されたメンバーが含まれていません。また、MYSQL_STMT構造のコピーを作ろうとすべきではありません。このようなコピーが使用可能である保証はありません。
マルチステートメントハンドルには接続が1個して付いていません。ハンドルの数に対する限度は利用できる資源によって変わります。
この構造は、ステートメント・インプット(サーバに送られたデータ値)とステートメント・アウトプット(サーバから戻された結果値)の両方のために使われます:
インプットに対して、MYSQL_BINDは、mysql_stmt_bind_param()と一緒に、パラメータデータを、mysql_stmt_execute()が使う目的でバッファーに固定するために使われます。
インプットに対して、MYSQL_BINDはmysql_stmt_bind_result()と一緒に、列をフェッチッするのに使用するため、結果セットバッファーを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はサーバに送る値を含む変数のタイプを示します。アウトプットに対してそれは、サーバから受け取った値を記憶させたい変数のタイプを示します。
void *buffer
データの転送に使用する、バッファーに対するポインター。これは変数のアドレスです。
インプットの場合、bufferはステートメントのパラメータが記憶される変数に対するポインターです。mysql_stmt_execute()を呼び出すとき、MySQLは変数に記憶した値を取り込んでそれを、ステートメント中の対応するパラメータ・マーカーの場所に置きます。
アウトプットの場合、bufferはその中に結果セットのコラム値を戻す変数に対するポインターです。mysql_stmt_fetch()を呼び出すとき、MySQLはカラム値を戻し、それをこの変数の中に記憶します。呼び出しに戻って値にアクセスすることができます。
MySQLが実施する必要のあるクライアント側のC言語の値とサーバ側のSQLの値の間のタイプ変換を最小にするため、対応するSQLの値と同等なタイプを含む変数を使ってください。データが数値タイプである場合、bufferをCタイプの適当な数値に指定すべきです。(charまたは整数変数の場合、あなたは、後で述べるunsignedメンバーをこのリストの中にセットすることによって、変数にis_unsigned属性が含まれているか否かも示すべきです。文字(非バイナリー)タイプおよびバイナリース・トリングデータタイプに対して、bufferをバッファーに指定すべきです。日付データタイプおよび時間データタイプに対して、bufferをMYSQL_TIME構造に指すべきです。
後のセクションにあるタイプ変換に関する注をご参照ください。
unsigned long buffer_length
*bufferの実サイズ(バイト)。これはバッファーに記憶することができるデータの最大量を示します。文字とバイナリーCデータに対して、buffer_length値は、mysql_stmt_bind_param()と一緒に使ってインプット値を規定する*bufferの長さ、またはmysql_stmt_bind_result()と一緒に使うとき、バッファーにフェッチできるアウトプットデータバイトの最大数を規定します。
unsigned long *length
*buffer中に記憶されたデータの実のバイト数を示す*buffer変数に対するポインター。lengthは文字またはバイナリーCデータに使われます。
インプットパラメータデータを結合する場合、lengthは、*buffer中に記憶されたパラメータ値の実際の長さを示すunsigned
long変数を指します。これはmysql_stmt_execute()によって使われます。
アアウトプット値を結合する場合、mysql_stmt_fetch()の戻り値は長さの解釈を決めます:
mysql_stmt_fetch()がゼロを戻す場合、*lengthは、パラメータ値の実の長さを示します。
mysql_stmt_fetch()がMYSQL_DATA_TRUNCATEDを戻す場合、*lengthはパラメータ価値の切り捨て前の長さを示します。この場合、*lengthとbuffer_lengthの最小は、その値の実の値を示します。
データ値の長さはbuffer_type値によって決まるので、lengthは数値タイプのデータと一時タイプのデータに対して無視されます。
my_bool *is_null
このナンバーは、値がNULLである場合、真で、それがNULLでない場合、虚となるmy_bool変数を指します。インプットに対して、*is_nullを真にセットして、NULL値をステートメントパラメータとして渡すことを示してください。
is_nullはブーリアンスカラーではないが、pointerの代わりにブーリアンスカラーをさす理由は、NULL値を規定する方法にフレキシビリティを提供することです:
データ値がいつもNULLである場合、カラムを結束するとき、MYSQL_TYPE_NULLをbuffer_type値として使ってください。他のメンバーは問題ではありません。
データ値がいつもNOT
NULLである場合、あなたが結束している変数に対して、他のメンバーを適当にセットし、is_null
= (my_bool*)
0をセットしてください。
その他の場合、他のメンバーを適当にセットし、is_nullをmy_bool変数のアドレスにセットしてください。実行と実行の間に変数の値を適当に真か虚にセットして、データ値がNULLであるかNOT
NULLであるかを、それぞれ示してください。
アウトプットに対して、is_nullをさす値は、ステートメントから戻された結果セットカラム値がNULLである場合、列をフェッチした後に真にセットされます。
my_bool is_unsigned
このメンバーは、unsigned
(char, short int,
int, long long
int)であることができるデータタイプと一緒にC変数のために使われます。bufferをさす変数がunsignedである場合、is_unsignedを真にセットし、そうでない場合には、虚にセットしてください。例えば、signed
char変数をbufferに結びつける場合、MYSQL_TYPE_TINYのタイプコードを規定し、
is_unsignedを虚にセットしてください。代わりに、unsigned
charを結びつける場合、タイプコードは同じですが、is_unsignedを真にすべきです。(charに対して、それがサインされるか否かが規定されないので、signed
charまたはunsigned
charを使って、サインについて明確にすることがベストです。)
is_unsignedはクライアント側のC言語変数だけに適用されます。それはクライアント側の対応するSQL値に対するサインの必要性に付いて何も示しません。例えば、intを使ってBIGINT
UNSIGNEDカラムのために値を供給する場合、intはサインするタイプなので、is_unsignedを虚にすべきです。unsigned
intを使ってBIGINTカラムのために値を供給する場合、unsigned
intはサインするタイプなので、is_unsignedを真にすべきです。MySQLは、結果が切り捨てられる場合警告が起こりますが、サイン済みの値と未サインの値の間の変換を両方向に実施します。
my_bool *error
アウトプットに対して、このメンバーをmy_bool変数をさして、列をフェッチした後、そこに記憶されたパラメータに対する切り捨て情報を持たせてください。(切り捨て報告はデフォルトによって有効化されますが、MYSQL_REPORT_DATA_TRUNCATIONオプションを使って、mysql_options()を呼び出すことによって、これを制御することができます。)切り捨て報告を有効化するとき、mysql_stmt_fetch()はMYSQL_DATA_TRUNCATEDを戻し、*errorは、その中で切り捨てが起こるMYSQL_BIND構造中で真となります。切り捨ては、サインまたは重要な桁の喪失あるいは、ストリングはコラムに収めるには長すぎたことを示します。
この構造は、DATE、TIME、DATETIMEおよびTIMESTAMPデータを直接サーバからかサーバに送り且つ受け取るのに使われます。MYSQL_BIND>構造のbuffer_typeメンバーを
一時タイプ(MYSQL_TYPE_TIME,
MYSQL_TYPE_DATE、MYSQL_TYPE_DATETIME、MYSQL_TYPE_TIMESTAMP)の一つにセットし、bufferメンバーをMYSQL_TIME構造をさすようにセットしてください。
MYSQL_TIME構造には、次のテーブルに列記したメンバーが含まれています:
| メンバー | 摘要 |
unsigned int year |
年 |
unsigned int month |
年の月 |
unsigned int day |
月の日 |
unsigned int hour |
日の時間 |
unsigned int minute |
時間の分 |
unsigned int second |
分の秒 |
my_bool neg |
時間がネガテブか否かを示すブーリアンフラグ |
unsigned long second_part |
マイクロ秒中の秒の部分;現在使用していない |
一時値の或るタイプに適用するMYSQL_TIME構造のこれらの部分だけが使われます。year、monthおよびdayエレメントは、DATE、DATETIMEおよびTIMESTAMP値に対して使用されます。hour、minuteおよびsecondエレメントは、TIME、DATETIMEおよびTIMESTAMP値に対して使用されます。項23.2.10. 「日付とタイム値のC API式取り扱い」を参照してください。
以下のテーブルは、インプットのためのMYSQL_BIND構造のbuffer_typeナンバーの中に規定することができる許容値を示します。その値はあなたが結合しているC言語変数のデータタイプに従って選択されるべきです。その値がunsignedである場合、is_unsignedナンバーも真にセットすべきです。テーブルは、使用できるC
変数タイプ、対応するタイプコードおよび供給された値を変換することなく使用できるSQLデータタイプを示します。
| 入力変数C型 |
buffer_type 値
|
SQL型のあて先値 |
signed char |
MYSQL_TYPE_TINY |
TINYINT |
short int |
MYSQL_TYPE_SHORT |
SMALLINT |
int |
MYSQL_TYPE_LONG |
INT |
long long int |
MYSQL_TYPE_LONGLONG |
BIGINT |
float |
MYSQL_TYPE_FLOAT |
FLOAT |
double |
MYSQL_TYPE_DOUBLE |
DOUBLE |
MYSQL_TIME |
MYSQL_TYPE_TIME |
TIME |
MYSQL_TIME |
MYSQL_TYPE_DATE |
DATE |
MYSQL_TIME |
MYSQL_TYPE_DATETIME |
DATETIME |
MYSQL_TIME |
MYSQL_TYPE_TIMESTAMP |
TIMESTAMP |
char[] |
MYSQL_TYPE_STRING (非バイナリデータ用) |
TEXT, CHAR, VARCHAR |
char[] |
MYSQL_TYPE_BLOB (バイナリデータ用) |
BLOB, BINARY, VARBINARY |
MYSQL_TYPE_NULL |
NULL |
MYSQL_TYPE_NULLの使用は、is_nullナンバーと関連させて前に説明されています。
以下のテーブルは、インプットのためのMYSQL_BIND構造のbuffer_typeナンバーの中に規定することができる許容値を示します。その値はあなたが結合しているC言語変数のデータタイプに従って選択されるべきです。その値がunsignedである場合、is_unsignedナンバーも真にセットすべきです。テーブルは、受領値のSQLタイプ、このような値が結果セットメタデータ中に持つ対応するタイプコード並びにSQL値を変換することなく受け取るMYSQL_BIND構造と結合する推薦されたC言語データのタイプを示します。
| SQL型の受信値 |
buffer_type 値
|
出力変数C型 |
TINYINT |
MYSQL_TYPE_TINY |
signed char |
SMALLINT |
MYSQL_TYPE_SHORT |
short int |
MEDIUMINT |
MYSQL_TYPE_INT24 |
int |
INT |
MYSQL_TYPE_LONG |
int |
BIGINT |
MYSQL_TYPE_LONGLONG |
long long int |
FLOAT |
MYSQL_TYPE_FLOAT |
float |
DOUBLE |
MYSQL_TYPE_DOUBLE |
double |
DECIMAL |
MYSQL_TYPE_NEWDECIMAL |
char[] |
YEAR |
MYSQL_TYPE_SHORT |
short int |
TIME |
MYSQL_TYPE_TIME |
MYSQL_TIME |
DATE |
MYSQL_TYPE_DATE |
MYSQL_TIME |
DATETIME |
MYSQL_TYPE_DATETIME |
MYSQL_TIME |
TIMESTAMP |
MYSQL_TYPE_TIMESTAMP |
MYSQL_TIME |
CHAR, BINARY |
MYSQL_TYPE_STRING |
char[] |
VARCHAR, VARBINARY |
MYSQL_TYPE_VAR_STRING |
char[] |
TINYBLOB, TINYTEXT |
MYSQL_TYPE_TINY_BLOB |
char[] |
BLOB, TEXT |
MYSQL_TYPE_BLOB |
char[] |
MEDIUMBLOB, MEDIUMTEXT |
MYSQL_TYPE_MEDIUM_BLOB |
char[] |
LONGBLOB, LONGTEXT |
MYSQL_TYPE_LONG_BLOB |
char[] |
BIT |
MYSQL_TYPE_BIT |
char[] |
タイプ変換を避けたい場合、C言語の変数タイプは推薦されたそれらです。クライアント側のC変数とサーバ側の対応するSQL値の間にミスマッチがある場合、MySQLは暗黙のタイプ変換を実施します。
MySQLはサーバ側のSQL値に対するタイプコードを知っています。buffer_type値は、クライアント側に値を保持する変数のタイプコードを示します。2つのコードは一緒になってMySQLにどんな変換を実施しなければならないかを告げます。以下に例を示します。
MYSQL_TYPE_LONGをint変数と一緒に使用して、整数値をFLOATカラムに記憶されるべきサーバに渡す場合、MySQLはその値を、それを記憶する前に浮動点フォーマットに変換します。
SQL
MEDIUMINTカラム値をフェッチするが、MYSQL_TYPE_LONGLONGのbuffer_type値を規定し、タイプlong
long
intのC変数をバッファーの行き先として使用する場合、MySQLは(8バイトより少ないメモリーを必要とする)MEDIUMINT値を、long
long
int(8バイトの変数)の中に記憶させるために変換します。
数値カラムを255の値を使って、char[4]文字アレーの中にフェッチし、MYSQL_TYPE_STRINGのbuffer_type値を規定する場合、アレー中の合成値は、'255\0'を含む4バイト・ストリングとなります。
DECIMAL値はストリングとして戻されます。これが対応するCタイプがchar[]である理由です。DECIMAL値は、最初のサーバ側の値のストリング表示に対応するサーバによって戻されます。例えば、12.345はクライアントに'12.345'として戻されます。MYSQL_TYPE_NEWDECIMALを規定し、ストリングバッファーをMYSQL_BIND構造につなげる場合、mysql_stmt_fetch()はバッファー中の値を、変換するこなく記憶します。代わりに、数値変数とタイプコード規定する場合、mysql_stmt_fetch()はストリングフォーマットDECIMAL値を数値フォームに変換します。
MYSQL_TYPE_BITタイプコードのために、BIT値はストリングバッファーの中に戻されます。(これによって、対応するCタイプもここのchar[]になります。)価値はクライアント側に関する解釈を必要とするビットストリングを表します。値を扱い易いタイプとして戻すため、+
0を使う次のフォームのクエリーを使って、値が整数に計算されるようにすることができます。
SELECT bit_col + 0 FROM t
値を復元するため、整数をその値を保持するに十分な大きさの変数に結び付けて、対応する適当な整数タイプコードを規定してください。
変数をカラムをフェッチするのに使用すべきMYSQL_BIND構造に結びつける前に、結果セットの各カラムに対して、タイプコードをチェックすることができます。どの変数タイプがタイプ変換を避けるために使うのに最も良いか決めたい場合、これが望ましいかもしれません。タイプコードを得るため、準備されたステートメントをmysql_stmt_execute()を使って実行した後、mysql_stmt_result_metadata()を呼び出してください。メタデータは、項23.2.7.22. 「mysql_stmt_result_metadata()」および項23.2.1. 「C APIデータタイプ」で述べた結果セットのためのタイプコードへのアクセス手段を提供します。
MYSQL_FIELDカラムメタデータ構造のmax_lengthメンバーを(mysql_stmt_attr_set()メンバーを呼び出すことによって)セットさせるようにする場合、結果セットのためのmax_length値が、バイナリー画面の長さではなく、結果値の最も長いストリングを示すことにご注目ください。即ち、max_lengthは、準備されたステートメントのために使用されたバイナリープロトコルを使って値をフェッチするに要するバッファーのサイズに必ずしも対応しません。バッファのサイズはその中に値をフェッチする変数のタイプに従って選択されるべきです。
MYSQL_TYPE_STRINGによって示される)インプット文字(非バイナリー)ストリングの日付に対して、その値はcharacter_set_clientシステム変数によって示される文字セットの中にあると見なします。値が異なった文字セットと一緒にカラムの中に記憶される場合、その文字セットに対して適切な変換が起こります。(MYSQL_TYPE_BLOBによって示される)インプットバイナリーストリングデータに対して、その値はbinary文字セットを含んでいるものとして処理されます。即ち、それはバイトストリングとして処理されるので、変換は起こりません。
サーバから戻されたアウトプットストリング値にバイナリーまたは非バイナリーデータが含まれているか否かを査定するには、結果セットメタデータのcharsetnr値が
63であるか否かをチェックします。
(項23.2.1. 「C APIデータタイプ」参照)そうである場合、文字セットはbinaryで、これは、非バイナリーデータでなく、バイナリーデータであることを示します。これが、BINARYとCHAR、VARBINARYとVARCHARおよびBLOB並びにTEXTタイプを区別することを可能にします。
