準備されたステートメントにはいくつかのデータ構造が使われます:
ステートメントを準備するため、ステートメントストリングを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
タイプを区別することを可能にします。