[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11. MySQL API

11.1 MySQL C API   
11.2 MySQL の ODBC サポート   
11.3 MySQL の Java 接続(JDBC)   
11.4 MySQL PHP API   
11.5 MySQL Perl API   
11.6 MySQL C++ API   
11.7 MySQL Python API   
11.8 MySQL Tcl API   
11.9 MySQL Eiffel Wrapper   

この章では、MySQL で使用できる API の入手場所および使用方法について説明します。最も豊富な種類が用意されているのが C API です。これは MySQL チームが開発しています。他言語向けの API は、この C API をベースにして開発されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1 MySQL C API

11.1.1 C API データ型   
11.1.2 C API 関数の概要   
11.1.3 C API 関数の説明   
11.1.4 C API のプリペアドステートメント   
11.1.5 C API のプリペアドステートメントのデータ型   
11.1.6 C API のプリペアドステートメント関数の概要   
11.1.7 C API のプリペアドステートメント関数の説明   
11.1.8 C API における複数クエリの実行の取り扱い   
11.1.9 C API における日付値および時刻値の取り扱い   
11.1.10 C API スレッド関数の説明   
11.1.11 C API 組み込みサーバ関数の説明   
11.1.12 C API の使用に関する一般的な質問および問題   
11.1.13 クライアントプログラムのビルド   
11.1.14 スレッドクライアントの作成方法   
11.1.15 組み込み MySQL サーバライブラリ libmysqld   

C API コードは、MySQL とともに配布されています。C API コードは mysqlclient ライブラリに格納され、C プログラムはこのコードを使用してデータベースにアクセスできます。

MySQL のソースディストリビューションに含まれるクライアントの多くは C で記述されています。C API の使用方法がわかるようなコード例を探している場合は、これらのクライアントを参考にしてください。クライアントは、MySQL ソースディストリビューションの clients ディレクトリに格納されています。

他のクライアント API(Connector/J を除くすべての API)の多くは、mysqlclient ライブラリを使用して MySQL サーバと通信します。このライブラリを使用すると、たとえば環境変数を参照できるので、他のクライアントプログラムとほとんどの環境変数を共用できることになります。共用できる環境変数の一覧については、 「4.9 MySQL クライアントサイドのスクリプトとユーティリティ」 を参照してください。

クライアントが使用できる通信バッファサイズには上限があります。内部的に割り当てられているバッファサイズ(16 キロバイト)は、最大 16 メガバイトまで自動的に増加します。バッファサイズが増加するのはバッファの要求量が増加した場合だけであり、デフォルトの最大値を増やしたからといって使用リソースが増加するわけではありません。このサイズチェックでは、誤ったクエリや通信パケットを主にチェックします。

通信バッファサイズは、SQL ステートメント 1 つ(クライアントからサーバへのトラフィック)および結果データ 1 行(サーバからクライアントへのトラフィック)を格納できるだけの大きさが必要です。各スレッドの通信バッファは、クエリやレコードを処理できるように、その最大値まで動的に拡大されます。たとえば、最大 16 メガバイトのデータを格納する BLOB 値を処理する場合、通信バッファサイズの最大値は(サーバとクライアントの両方で)少なくとも 16 メガバイトである必要があります。クライアントのデフォルトの最大値は 16 メガバイトですが、サーバのデフォルトの最大値は 1 メガバイトです。サーバのデフォルトの最大値を増やすには、サーバの起動時に max_allowed_packet の値を変更します。 「5.5.2 サーバパラメータのチューニング」 節 参照 。

MySQL サーバは、クエリが終わるたびに通信バッファサイズを net_buffer_length に減らします。クライアント側では、接続が切断されてメモリが解放されるまで、その接続に割り当てられたバッファサイズが減ることはありません。

スレッドを使用するプログラミングについては、 「11.1.14 スレッドクライアントの作成方法」 を参照してください。同一プログラム内に "サーバー" と "クライアント" が存在する(および外部の MySQL サーバと通信しない)スタンドアロンアプリケーションの作成については、 「11.1.15 組み込み MySQL サーバライブラリ libmysqld」 を参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.1 C API データ型

MYSQL
この構造体は、1 つのデータベース接続へのハンドルを表す。ほとんどの MySQL 関数で使用される。

MYSQL_RES
この構造体は、レコードを返すクエリ(SELECTSHOWEXPLAINDESCRIBE)の結果を表す。このセクションでは、クエリから返された情報を結果セットと呼ぶ。

MYSQL_ROW
1 行のデータのタイプセーフな表現。現在は、バイト文字列の配列として実装されている(フィールドにはバイナリデータが格納される場合があり、そのようなデータでは内部的にヌルバイトが使用される可能性があるので、バイト文字列をヌル終端文字列として扱うことはできない)。レコードを取得するには、mysql_fetch_row() を呼び出す。

MYSQL_FIELD
この構造体には、フィールドの名前、型、サイズなど、フィールドに関する情報が格納される。メンバの詳細については、以下で説明する。 各フィールドに対して mysql_fetch_field() を繰り返し呼び出すことによって、対応する MYSQL_FIELD 構造体を取得できる。フィールド値はこの構造体の一部ではなく、MYSQL_ROW 構造体に含まれる。

MYSQL_FIELD_OFFSET
MySQL フィールド一覧に対するオフセットの安全な型表現(mysql_field_seek() が使用)。オフセットはレコード内部でのフィールド番号であり、0 から始まる。

my_ulonglong
レコードの数を表すための型であり、mysql_affected_rows()mysql_num_rows()、および mysql_insert_id() で使用される。0 から 1.84e19 までの範囲の値を表す。

一部のシステムでは、my_ulonglong 型の値を出力しようとしても、正常に出力されない。この型の値を出力するには、unsigned long に変換して、%lu フォーマットを使用する。以下に例を示す。
 
printf ("Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));

MYSQL_FIELD 構造体のメンバを以下に示します。

char * name
フィールドの名前。ヌル終端文字列。

char * table
このフィールドが計算結果データのフィールドでない場合、このフィールドが属するテーブルの名前。計算結果データのフィールドの場合、table の値は空文字列になる。

char * def
このフィールドのデフォルト値。ヌル終端文字列。mysql_list_fields() を使用するときだけ設定される。

enum enum_field_types type
フィールドの型。 type の値は次のいずれかになる。

型の値 型の説明
FIELD_TYPE_TINY TINYINT フィールド
FIELD_TYPE_SHORT SMALLINT フィールド
FIELD_TYPE_LONG INTEGER フィールド
FIELD_TYPE_INT24 MEDIUMINT フィールド
FIELD_TYPE_LONGLONG BIGINT フィールド
FIELD_TYPE_DECIMAL DECIMAL または NUMERIC フィールド
FIELD_TYPE_FLOAT FLOAT フィールド
FIELD_TYPE_DOUBLE DOUBLE または REAL フィールド
FIELD_TYPE_TIMESTAMP TIMESTAMP フィールド
FIELD_TYPE_DATE DATE フィールド
FIELD_TYPE_TIME TIME フィールド
FIELD_TYPE_DATETIME DATETIME フィールド
FIELD_TYPE_YEAR YEAR フィールド
FIELD_TYPE_STRING CHAR フィールド
FIELD_TYPE_VAR_STRING VARCHAR フィールド
FIELD_TYPE_BLOB BLOB または TEXT フィールド(max_length を使用して最大長を決定)
FIELD_TYPE_SET SET フィールド
FIELD_TYPE_ENUM ENUM フィールド
FIELD_TYPE_NULL NULL 型フィールド
FIELD_TYPE_CHAR 廃止(代わりに FIELD_TYPE_TINY を使用すること)

IS_NUM() マクロを使用すると、フィールドが数値型かどうかを調べることができる。type の値を IS_NUM() に渡すと、フィールドが数値型の場合は TRUE と評価される。

 
if (IS_NUM(field->type))
    printf("Field is numeric\n");

unsigned int length
フィールドの幅。テーブル定義で指定された値に従う。

unsigned int max_length
結果セットのフィールドの最大幅(結果セットに実際に存在するレコードのフィールド値の最大長)。mysql_store_result() または mysql_list_fields() を使用した場合、この値はフィールドの最大長を表す。mysql_use_result() を使用した場合、この値は 0 になる。

unsigned int flags
フィールドのさまざまな状態を表すビットフラグ。flags 値は、0 または以下のビットが 1 つ以上設定された値になる。

フラグの値 フラグの説明
NOT_NULL_FLAG NULL を設定できないフィールド
PRI_KEY_FLAG 主キーの一部を構成するフィールド
UNIQUE_KEY_FLAG 一意なキーの一部を構成するフィールド
MULTIPLE_KEY_FLAG 一意でないキーの一部を構成するフィールド
UNSIGNED_FLAG UNSIGNED 属性を持つフィールド
ZEROFILL_FLAG ZEROFILL 属性を持つフィールド
BINARY_FLAG BINARY 属性を持つフィールド
AUTO_INCREMENT_FLAG AUTO_INCREMENT 属性を持つフィールド
ENUM_FLAG ENUM 型のフィールド(廃止)
SET_FLAG SET 型のフィールド(廃止)
BLOB_FLAG BLOB 型または TEXT 型のフィールド(廃止)
TIMESTAMP_FLAG TIMESTAMP 型のフィールド(廃止)

BLOB_FLAGENUM_FLAGSET_FLAG、および TIMESTAMP_FLAG の各フラグは、フィールドの属性ではなく型を示しているので、廃止されている。代わりに、field->typeFIELD_TYPE_BLOBFIELD_TYPE_ENUMFIELD_TYPE_SET、または FIELD_TYPE_TIMESTAMP と比較する方が望ましい。

次に、flags 値の典型的な使用例を示す。

 
if (field->flags & NOT_NULL_FLAG)
    printf("Field can't be null\n");

以下のマクロを使用すると、flags 値を調べてブール値で結果を得ることができる。

フラグの状態 説明
IS_NOT_NULL(flags) このフィールドが NOT NULL として定義されている場合は True。
IS_PRI_KEY(flags) このフィールドが主キーの場合は True。
IS_BLOB(flags) このフィールドが BLOB または TEXT の場合は True (廃止。代わりに field->type による比較を推奨)。

unsigned int decimals
数値フィールドの小数部桁数。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.2 C API 関数の概要

ここでは、C API で提供されている関数について簡単に説明します。詳細については、以降のセクションで説明します。 「11.1.3 C API 関数の説明」 節 参照 。

最後に実行された UPDATEDELETE、または INSERT のいずれかのクエリによって変更、削除、または挿入されたレコードの数を返す。 オープンされた接続のユーザおよびデータベースを変更する。 接続のデフォルトのキャラクタセットの名前を返す。 サーバ接続を切断する。 MySQL サーバに接続する。この関数は廃止されているので、代わりに mysql_real_connect() を使用すること。 データベースを作成する。この関数は廃止されているので、代わりに SQL コマンド CREATE DATABASE を使用すること。 クエリ結果セットの任意のレコード番号にシークする。 指定された文字列で DBUG_PUSH を実行する。 データベースを破棄する。この関数は廃止されているので、代わりに SQL コマンド DROP DATABASE を使用すること。 デバッグ情報をログに書き込むようにサーバに指示する。 結果セットの最後のレコードが読み込まれたかどうかを判定する。 この関数は廃止されており、代わりに mysql_errno() または mysql_error() を使用できる。 最後に呼び出された MySQL 関数のエラー番号を返す。 最後に呼び出された MySQL 関数のエラーを返す。 文字列に含まれる特殊文字をエスケープして、SQL ステートメントで使用できるようにする。 テーブルの次のフィールドの型を返す。 フィールド番号で指定されたテーブルフィールドの型を返す。 すべてのフィールド構造体の配列を返す。 現在のレコードのすべてのカラムについてその長さを返す。 結果セットの次のレコードを取得する。 指定されたカラムにカラムカーソルを移動する。 最後に実行されたクエリの結果セットのカラム数を返す。 最後に実行された mysql_fetch_field() で使用されたフィールドカーソルの位置を返す。 結果セットで使用したメモリを解放する。 クライアントのバージョン情報を文字列として返す。 クライアントのバージョン情報を整数として返す。 接続を記述する文字列を返す。 サーバのバージョン番号を整数として返す(4.1 の新機能)。 接続に使用しているプロトコルのバージョンを返す。 サーバのバージョン番号を返す。 最後に実行されたクエリに関する情報を返す。 MYSQL 構造体を取得または初期化する。 前回実行されたクエリで生成した AUTO_INCREMENT カラムの ID を返す。 指定されたスレッドを強制終了する。 単純な正規表現に一致するデータベース名を返す。 単純な正規表現に一致するフィールド名を返す。 現在のサーバスレッドの一覧を返す。 単純な正規表現に一致するテーブル名を返す。 結果セットのカラム数を返す。 結果セットのレコード数を返す。 mysql_connect() の接続オプションを設定する。 サーバへの接続が正常かどうかを確認し、必要なら再接続する。 ヌル終端文字列として指定されている SQL クエリを実行する。 MySQL サーバに接続する。 接続の現在のキャラクタセットを考慮して、文字列に含まれる特殊文字をエスケープし、SQL ステートメントで使用できるようにする。 バイト文字列として指定されている SQL クエリを実行する。 権限テーブルの再読み込みをサーバに指示する。 mysql_row_tell() から返された値をオフセットとして、結果セット内のレコードにシークする。 レコードカーソルの位置を返す。 データベースを選択する。 接続のオプション(multi-statements など)を設定する。 最後に発生したエラーの SQLSTATE エラーコードを返す。 データベースサーバをシャットダウンする。 サーバステータスを文字列として返す。 結果セット全体を取得してクライアントに転送する。 現在のスレッド ID を返す。 クライアントがスレッドセーフとしてコンパイルされている場合は 1 を返す。 レコード単位の結果セットの取得を開始する。 前回実行した SQL ステートメントの警告数を返す。 トランザクションをコミットする(4.1 の新機能)。 トランザクションをロールバックする(4.1 の新機能)。 自動コミットモードのオン/オフを切り替える(4.1 の新機能)。 まだ取得していない結果セットが存在するかどうかを調べる(4.1 の新機能)。 マルチクエリを実行している場合、次の結果セットを取得し、返す(4.1 の新機能)。
関数 説明
mysql_affected_rows()
mysql_change_user()
mysql_character_set_name()
mysql_close()
mysql_connect()
mysql_create_db()
mysql_data_seek()
mysql_debug()
mysql_drop_db()
mysql_dump_debug_info()
mysql_eof()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_fetch_lengths()
mysql_fetch_row()
mysql_field_seek()
mysql_field_count()
mysql_field_tell()
mysql_free_result()
mysql_get_client_info()
mysql_get_client_version()
mysql_get_host_info()
mysql_get_server_version()
mysql_get_proto_info()
mysql_get_server_info()
mysql_info()
mysql_init()
mysql_insert_id()
mysql_kill()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_num_fields()
mysql_num_rows()
mysql_options()
mysql_ping()
mysql_query()
mysql_real_connect()
mysql_real_escape_string()
mysql_real_query()
mysql_reload()
mysql_row_seek()
mysql_row_tell()
mysql_select_db()
mysql_set_server_option()
mysql_sqlstate()
mysql_shutdown()
mysql_stat()
mysql_store_result()
mysql_thread_id()
mysql_thread_safe()
mysql_use_result()
mysql_warning_count()
mysql_commit()
mysql_rollback()
mysql_autocommit()
mysql_more_results()
mysql_next_result()

サーバに接続するには、mysql_init() を呼び出して接続ハンドラを初期化し、次にそのハンドラ(およびホスト名、ユーザ名、パスワードなどのその他の情報)をパラメータとして mysql_real_connect() を呼び出します。接続が確立したとき、mysql_real_connect() によって reconnect フラグ(MYSQL 構造体の一部)の値が 1 に設定されます。このフラグは、接続が切断されてクエリを実行できない場合に、そこでクエリを終了せずに、サーバへの再接続を試みることを意味します。接続が必要なくなったら、mysql_close() を呼び出して接続を切断します。

接続がアクティブな場合、クライアントは mysql_query() または mysql_real_query() を使用してサーバに SQL クエリを送信できます。この 2 つの違いは、mysql_query() はクエリをヌル終端文字列として、mysql_real_query() はクエリをバイト文字列として、それぞれ受け取ります。文字列にバイナリデータが含まれる(ヌルバイトが含まれる可能性がある)場合は、mysql_real_query() を使用する必要があります。

SELECT クエリ(たとえば、INSERTUPDATEDELETE)を実行した場合、変更された(影響を受けた)レコードの数を知るには、mysql_affected_rows() を呼び出します。

SELECT クエリを実行した場合、選択されたレコードを結果セットとして取得します(注意: SHOWDESCRIBE、および EXPLAIN のように、レコードを返すという点で SELECT に似ているステートメントがあり、これらは SELECT ステートメントと同様に扱う必要があります)。

クライアントが結果セットを処理する方法は 2 つあります。1 つは、mysql_store_result() を呼び出して結果セット全体を一括して取得する方法です。この関数は、クエリから返されたすべてのレコードをサーバから取得し、クライアントに保存します。もう 1 つは、mysql_use_result() を呼び出して、クライアントがレコード単位で結果セットの取得を開始する方法です。この関数は結果セットを取得する処理の初期化は行いますが、実際にはサーバからレコードを受け取っていません。

どちらの場合も、レコードにアクセスするには mysql_fetch_row() を呼び出します。mysql_store_result() を使用した場合、mysql_fetch_row() は、すでにサーバから取得されているレコードにアクセスします。mysql_use_result() を使用した場合、mysql_fetch_row() は実際にサーバからレコードを取得します。各レコードのデータサイズは、mysql_fetch_lengths() を呼び出すことによって知ることができます。

結果セットが必要なくなったら、mysql_free_result() を呼び出して、使用していたメモリを解放します。

2 つの取得メカニズムは、状況に応じて使い分けます。クライアントプログラムは、必要に応じて最も適切な方法を選択する必要があります。実際には、mysql_store_result() を多用する傾向があります。

mysql_store_result() の長所は、すべてのレコードがクライアントに取得済みなので、レコードに順次アクセスできるだけでなく、mysql_data_seek() または mysql_row_seek() を使用して結果セット内でのカレントレコードの位置を変更することによって、結果セット内を前後に移動できることです。結果セットに含まれるレコード数を知るには、mysql_num_rows() を呼び出します。一方で、結果セットが大きい場合の mysql_store_result() のメモリ要件は非常に厳しい場合があり、メモリ不足が発生する可能性は高くなります。

mysql_use_result() の長所は、一度に 1 行のレコードしか保持しないので、クライアントが結果セットで使用するメモリが少なくてすむことです(また、メモリ割り当てのオーバヘッドが少ないので mysql_use_result() の実行速度も向上します)。短所は、サーバを拘束しないように各レコードに対する処理を短時間で終わらせる必要があること、結果セット内のレコードに対するランダムアクセス機能がないこと(順次アクセスのみ)、すべてのレコードを取得するまで結果セットに含まれるレコード数がわからないことです。さらに、探していた情報が順次アクセスの途中で見つかった場合でも、最後まですべてのレコードを取得する必要があります

クライアントは API を使用することで、クエリが SELECT かどうかがわからなくても、クエリに対して適切に応答する(必要に応じてレコードを取得する)ことができます。そのためには、mysql_query()(または mysql_real_query())を呼び出すたびに mysql_store_result() を呼び出します。この呼び出しが正常終了した場合、クエリは SELECT だったことになり、レコードを読み込むことができます。呼び出しが失敗した場合、mysql_field_count() を呼び出して、この結果がクエリの結果として予想されたものだったかどうかを判断します。mysql_field_count() が 0 を返した場合、クエリが返したデータはなく(INSERTUPDATEDELETE などのクエリだったことを意味する)、レコードを返すクエリではなかったと判断されます。mysql_field_count() が 0 以外の値を返した場合、レコードを返すはずのクエリが実行されたけれども、何も返さなかったと判断されます。これは、SELECT クエリが失敗したことを意味します。ここに示した方法のコーディング例については、mysql_field_count() の説明を参照してください。

mysql_store_result() および mysql_use_result() はどちらも、結果セットを構成するフィールドに関する情報(フィールドの数、名前、型など)を取得します。レコードのフィールド情報に順次アクセスするには、mysql_fetch_field() を繰り返し呼び出すか、またはレコードのフィールド番号を指定して mysql_fetch_field_direct() を呼び出します。現在のフィールドカーソルの位置を変更するには、mysql_field_seek() を呼び出します。フィールドカーソルの位置を変更すると、その後に呼び出された mysql_fetch_field() の動作に影響を与えます。mysql_fetch_fields() を呼び出すと、すべてのフィールドの情報を一括して取得できます。

エラーを検出し、報告する場合、mysql_errno() および mysql_error() を使用してエラー情報にアクセスします。この 2 つの関数は、最後に呼び出された、成功または失敗の可能性のある関数のエラーコードまたはエラーメッセージを返します。この結果によって、エラーが発生したタイミングとその内容を判断します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3 C API 関数の説明

11.1.3.1 mysql_affected_rows()   
11.1.3.2 mysql_change_user()   
11.1.3.3 mysql_character_set_name()   
11.1.3.4 mysql_close()   
11.1.3.5 mysql_connect()   
11.1.3.6 mysql_create_db()   
11.1.3.7 mysql_data_seek()   
11.1.3.8 mysql_debug()   
11.1.3.9 mysql_drop_db()   
11.1.3.10 mysql_dump_debug_info()   
11.1.3.11 mysql_eof()   
11.1.3.12 mysql_errno()   
11.1.3.13 mysql_error()   
11.1.3.14 mysql_escape_string()   
11.1.3.15 mysql_fetch_field()   
11.1.3.16 mysql_fetch_fields()   
11.1.3.17 mysql_fetch_field_direct()   
11.1.3.18 mysql_fetch_lengths()   
11.1.3.19 mysql_fetch_row()   
11.1.3.20 mysql_field_count()   
11.1.3.21 mysql_field_seek()   
11.1.3.22 mysql_field_tell()   
11.1.3.23 mysql_free_result()   
11.1.3.24 mysql_get_client_info()   
11.1.3.25 mysql_get_client_version()   
11.1.3.26 mysql_get_host_info()   
11.1.3.27 mysql_get_proto_info()   
11.1.3.28 mysql_get_server_info()   
11.1.3.29 mysql_get_server_version()   
11.1.3.30 mysql_info()   
11.1.3.31 mysql_init()   
11.1.3.32 mysql_insert_id()   
11.1.3.33 mysql_kill()   
11.1.3.34 mysql_list_dbs()   
11.1.3.35 mysql_list_fields()   
11.1.3.36 mysql_list_processes()   
11.1.3.37 mysql_list_tables()   
11.1.3.38 mysql_num_fields()   
11.1.3.39 mysql_num_rows()   
11.1.3.40 mysql_options()   
11.1.3.41 mysql_ping()   
11.1.3.42 mysql_query()   
11.1.3.43 mysql_real_connect()   
11.1.3.44 mysql_real_escape_string()   
11.1.3.45 mysql_real_query()   
11.1.3.46 mysql_reload()   
11.1.3.47 mysql_row_seek()   
11.1.3.48 mysql_row_tell()   
11.1.3.49 mysql_select_db()   
11.1.3.50 mysql_set_server_option()   
11.1.3.51 mysql_shutdown()   
11.1.3.52 mysql_sqlstate()   
11.1.3.53 mysql_ssl_set()   
11.1.3.54 mysql_stat()   
11.1.3.55 mysql_store_result()   
11.1.3.56 mysql_thread_id()   
11.1.3.57 mysql_use_result()   
11.1.3.58 mysql_warning_count()   
11.1.3.59 mysql_commit()   
11.1.3.60 mysql_rollback()   
11.1.3.61 mysql_autocommit()   
11.1.3.62 mysql_more_results()   
11.1.3.63 mysql_next_result()   

ここの説明の中で、パラメータまたは戻り値に NULL が使用されている場合、これは C 言語における NULL を表しており、MySQL における NULL 値ではありません。

値を返す関数は、一般にポインタまたは整数を返します。特に指定されていないかぎり、ポインタを返す関数が非 NULL 値を返した場合は正常終了を、NULL 値を返した場合はエラーを示します。同様に、整数を返す関数が 0 を返した場合は正常終了を、0 以外の値を返した場合はエラーを示します。注意: "0 以外" ということに、それ以上の意味はありません。関数説明に特に記述がないかぎり、0 以外の値に対して比較テストは必要ありません。

 
if (result)                   /* correct */
    ... error ...

if (result < 0)               /* incorrect */
    ... error ...

if (result == -1)             /* incorrect */
    ... error ...

関数が返すエラーについては、関数説明の中の「エラー」サブセクションを参照してください。発生したエラーを調べるには、mysql_errno() を呼び出します。mysql_error() を呼び出すと、エラー内容の文字列表現を取得できます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.1 mysql_affected_rows()

my_ulonglong mysql_affected_rows(MYSQL *mysql)

説明

最後に呼び出された UPDATE によって変更されたレコード数、最後に呼び出された DELETE によって削除されたレコード数、または最後に呼び出された INSERT によって挿入されたレコード数を返します。UPDATEDELETE、または INSERT のいずれかのステートメントについて mysql_query() を呼び出した後に、この関数を呼び出します。SELECT ステートメントの場合、mysql_affected_rows() を呼び出すと、mysql_num_rows() と同様に動作します。

戻り値

正の整数は、影響を与えた、または取得した、レコード数を示します。0 は、UPDATE によって更新されたレコードがなかったこと、クエリの WHERE 節に一致するレコードがなかったこと、またはクエリが実行されていないことを示します。-1 は、クエリがエラーを返したこと、または SELECT クエリの場合に mysql_store_result() を呼び出す前に mysql_affected_rows() が呼び出されたことを示します。

エラー

ありません。

 
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));

mysqld に接続する際にフラグ CLIENT_FOUND_ROWS が指定されている場合、mysql_affected_rows()UPDATE ステートメントの WHERE 節に一致するレコード数を返します。

注意: REPLACE コマンドで既存のレコードが新しいレコードで置き換えられた場合は mysql_affected_rows() は 2 を返します。これは、レコードが 1 行挿入された後で重複したレコードが削除されたためです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.2 mysql_change_user()

my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)

説明

ユーザを変更し、db で指定されたデータベースを mysql で指定された接続のデフォルト(カレント)データベースにします。このデータベースは、その後実行されるクエリで明示的なデータベース指定子のないテーブル参照が行われる際のデフォルトになります。

この関数は、MySQL 3.23.3 で導入されました。

mysql_change_user() は、指定したユーザが認証されない場合、またはそのユーザがデータベースを使用する権限を持たない場合に、失敗します。この場合、ユーザおよびデータベースは変更されません。

デフォルトデータベースを使用しない場合、db パラメータを NULL に設定します。

MySQL 4.0.6 以降、このコマンドは、新しい接続が確立した場合は常に、任意のアクティブなトランザクションの ROLLBACK の実行、すべてのテンポラリテーブルのクローズ、ロックされたすべてのテーブルのアンロック、および状態のリセットを行います。この処理は、ユーザが変更されなかった場合も必ず行われます。

戻り値

正常終了した場合は 0。エラーが発生した場合は 0 以外。

エラー

mysql_real_connect() が返すエラーと同じ。

CR_COMMANDS_OUT_OF_SYNC
コマンドが正しい順序で実行されなかった。
CR_SERVER_GONE_ERROR
MySQL サーバがいなくなった。
CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。
CR_UNKNOWN_ERROR
不明なエラーが発生した。
ER_UNKNOWN_COM_ERROR
MySQL サーバでこのコマンドが実装されていない(バージョンが古いと考えられる)。
ER_ACCESS_DENIED_ERROR
ユーザまたはパスワードが正しくない。
ER_BAD_DB_ERROR
データベースが存在しない。
ER_DBACCESS_DENIED_ERROR
ユーザがデータベースへのアクセス権を持っていない。
ER_WRONG_DB_NAME
データベース名が長すぎる。

 
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.3 mysql_character_set_name()

const char *mysql_character_set_name(MYSQL *mysql)

説明

現在の接続のデフォルトのキャラクタセットを返します。

戻り値

デフォルトのキャラクタセット。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.4 mysql_close()

void mysql_close(MYSQL *mysql)

説明

すでにオープンされている接続をクローズします。mysql で示される接続ハンドルが mysql_init() または mysql_connect() によって自動的に割り当てられたハンドルだった場合は、mysql_close() で割り当てが解除されます。

戻り値

ありません。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.5 mysql_connect()

MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)

説明

この関数は廃止されています。代わりに mysql_real_connect() を使用してください。

mysql_connect() は、host 上で実行している MySQL データベースエンジンへの接続を確立しようとします。mysql_connect() が正常終了しなければ、他の API 関数(mysql_get_client_info() を除く)を実行できません。

パラメータの意味は、mysql_real_connect() での対応するパラメータと同じですが、接続パラメータに NULL を渡すことができるという違いがあります。この場合、C API は接続構造体に自動的にメモリを割り当てます。このメモリは mysql_close() を呼び出すことによって解放されます。この方法には、接続に失敗したときにエラーメッセージを取得できないという短所があります(mysql_errno() または mysql_error() からエラー情報を取得するには有効な MYSQL ポインタを渡す必要があります)。

戻り値

mysql_real_connect() と同じです。

エラー

mysql_real_connect() と同じです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.6 mysql_create_db()

int mysql_create_db(MYSQL *mysql, const char *db)

説明

db パラメータで指定された名前でデータベースを作成します。

この関数は廃止されています。代わりに、mysql_query() を使用して CREATE DATABASE ステートメントを発行してください。

戻り値

データベースが正常に作成された場合は 0。エラーが発生した場合は 0 以外。

エラー

CR_COMMANDS_OUT_OF_SYNC
コマンドが正しい順序で実行されなかった。

CR_SERVER_GONE_ERROR
MySQL サーバがいなくなった。

CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。

CR_UNKNOWN_ERROR
不明なエラーが発生した。

 
if(mysql_create_db(&mysql, "my_database"))
{
   fprintf(stderr, "Failed to create new database.  Error: %s\n",
           mysql_error(&mysql));
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.7 mysql_data_seek()

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)

説明

クエリ結果セットの任意のレコードにシークします。offset 値はレコード番号を表し、0 から mysql_num_rows(stmt)-1 の範囲で指定します。

mysql_data_seek() を使用するには、結果セット構造体にクエリの結果全体が格納されている必要があるので、mysql_use_result() ではなく、mysql_store_result() とともに使用する必要があります。

戻り値

ありません。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.8 mysql_debug()

void mysql_debug(const char *debug)

説明

指定された文字列で DBUG_PUSH を実行します。mysql_debug() は、Fred Fish デバッグライブラリを使用します。この関数を使用するには、デバッグをサポートするためのクライアントライブラリをコンパイルする必要があります。 「E.1 MySQL サーバのデバッグ」 節 参照 。 「E.2 MySQL クライアントのデバッグ」 節 参照 。

戻り値

ありません。

エラー

ありません。

次のコードを実行すると、クライアントライブラリによってクライアントマシンの `/tmp/client.trace' にトレースファイルが生成されます。

 
mysql_debug("d:t:O,/tmp/client.trace");


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.9 mysql_drop_db()

int mysql_drop_db(MYSQL *mysql, const char *db)

説明

db パラメータで指定された名前のデータベースを破棄します。

この関数は廃止されています。代わりに、mysql_query() を使用して DROP DATABASE ステートメントを発行してください。

戻り値

データベースが正常に破棄された場合は 0。エラーが発生した場合は 0 以外。

エラー

CR_COMMANDS_OUT_OF_SYNC
コマンドが正しい順序で実行されなかった。
CR_SERVER_GONE_ERROR
MySQL サーバがいなくなった。
CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。
CR_UNKNOWN_ERROR
不明なエラーが発生した。

 
if(mysql_drop_db(&mysql, "my_database"))
  fprintf(stderr, "Failed to drop the database: Error: %s\n",
          mysql_error(&mysql));


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.10 mysql_dump_debug_info()

int mysql_dump_debug_info(MYSQL *mysql)

説明

デバッグ情報をログに書き込むようにサーバに指示します。接続ユーザが SUPER 特権を持たない場合は正常に動作しません。

戻り値

正常に動作した場合は 0。エラーが発生した場合は 0 以外。

エラー

CR_COMMANDS_OUT_OF_SYNC
コマンドが正しい順序で実行されなかった。
CR_SERVER_GONE_ERROR
MySQL サーバがいなくなった。
CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。
CR_UNKNOWN_ERROR
不明なエラーが発生した。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.11 mysql_eof()

my_bool mysql_eof(MYSQL_RES *result)

説明

この関数は廃止されています。代わりに mysql_errno() または mysql_error() を使用できます。

mysql_eof() は、結果セットの最後のレコードが読み込まれたかどうかを判定します。

mysql_store_result() を呼び出して結果セットを取得する場合、クライアントは 1 回の動作で結果セット全体を受け取ります。この場合、mysql_fetch_row() を呼び出して戻り値が NULL であれば、すでに結果セットの最後に到達していたことがわかるので、mysql_eof() を呼び出す必要はありません。mysql_store_result() と一緒に使用する場合、mysql_eof() は常に true を返します。

一方、mysql_use_result() を使用して結果セットの取得を開始した場合は、mysql_fetch_row() を繰り返し呼び出すことによってそのレコードを 1 行ずつサーバから取得します。この手順を実行している途中で接続に異常が発生する場合があるので、mysql_fetch_row() を呼び出して戻り値が NULL であっても、それが必ずしも結果セットの最後に正常に到達したことを意味するわけではありません。この場合は、mysql_eof() を使用することによって、どういう状況なのかを判断できます。mysql_eof() は、結果セットの最後に到達していた場合は 0 以外、エラーが発生していた場合は 0 を返します。

mysql_eof() は、歴史的には標準の MySQL エラー関数である mysql_errno() および mysql_error() の前身です。これらのエラー関数は同じ情報を返すので、すでに廃止されている mysql_eof() よりも優先して使用してください(実際、mysql_eof() が返すのはブール値だけで、エラー関数はエラー発生理由を示すより多くの情報を返します)。

戻り値

エラーが発生していない場合は 0。結果セットの最後に到達していた場合は 0 以外。

エラー

ありません。

mysql_eof() には次のような使い方が考えられます。

 
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(!mysql_eof(result))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}

ただし、標準の MySQL エラー関数を次のように使用すれば、同じ動作を実現できます。

 
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(mysql_errno(&mysql))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.12 mysql_errno()

unsigned int mysql_errno(MYSQL *mysql)

説明

mysql_errno() は、mysql で指定される接続について、最後に呼び出された、成功または失敗する可能性のある API 関数のエラーコードを返します。戻り値が 0 の場合、エラーは発生していません。クライアントのエラーメッセージ番号の一覧は、MySQL `errmsg.h' ヘッダファイルに記述されています。サーバのエラーメッセージ番号の一覧は、`mysqld_error.h' に記述されています。MySQL ソースディストリビューションに含まれるファイル `Docs/mysqld_error.txt' には、すべてのエラーメッセージおよびエラー番号の一覧が記述されています。サーバのエラーコードの一覧は、 「12.1 返されるエラー」 にも記載されています。

注意: mysql_fetch_row() などの一部の関数は、成功した場合に mysql_errno() を設定しません。

大体の目安として、サーバに情報を要求する関数は、成功した場合に mysql_errno() をリセットすると考えてください。

戻り値

最後に呼び出された mysql_xxx 関数が失敗していた場合はそのエラーコード。0 はエラーが発生しなかったことを示します。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.13 mysql_error()

const char *mysql_error(MYSQL *mysql)

説明

mysql_error() は、mysql で指定された接続について、最後に呼び出された API 関数が失敗した際のエラーメッセージをヌル終端文字列として返します。関数が失敗しなかった場合、mysql_error() の戻り値はその前のエラーメッセージか、エラーがまったく発生していない場合は空文字列になります。

大体の目安として、サーバに情報を要求する関数は、成功した場合に mysql_error() をリセットすると考えてください。

mysql_errno をリセットする関数では、次の 2 つの比較は同等です。

 
if(mysql_errno(&mysql))
{
    // an error occurred
}

if(mysql_error(&mysql)[0] != '\0')
{
    // an error occurred
}

クライアントのエラーメッセージの言語は、MySQL クライアントライブラリを再コンパイルすることによって変更できます。現在は、複数の異なる言語でエラーメッセージを返すことができます。 「4.7.2 英語以外のエラーメッセージ」 節 参照 。

戻り値

エラーの内容を説明するヌル終端文字列。エラーが発生していない場合は空文字列。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.14 mysql_escape_string()

この関数の代わりに mysql_real_escape_string() を使用してください。

mysql_real_escape_string() は先頭の引数として接続ハンドラを受け取り、現在のキャラクタセットに従って文字列をエスケープしますが、その 2 点を除けば、この関数と mysql_real_escape_string() は同じです。mysql_escape_string() は接続ハンドラを引数として受け取りません。また、現在のキャラクタセットは参照しません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.15 mysql_fetch_field()

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

説明

結果セットに含まれる 1 つのカラムの定義を MYSQL_FIELD 構造体として返します。結果セットに含まれるすべてのカラムの定義を取得するには、この関数を繰り返し呼び出します。定義を取得するカラムが残っていない場合、mysql_fetch_field()NULL を返します。

新しく SELECT クエリを実行するたびに、mysql_fetch_field() は先頭のカラムの定義を返すようにリセットされます。また、mysql_field_seek() を呼び出した場合も、mysql_fetch_field() が返すフィールドが変わります。

mysql_query() を呼び出してテーブルに対して SELECT を実行した後 mysql_store_result() を呼び出さなかった場合、mysql_fetch_field() を呼び出して BLOB フィールドの長さを要求すると、デフォルトの BLOB 長(8 キロバイト)が返されます(MySQL は BLOB の最大長がわからないので 8 キロバイトを返します。この値は将来設定可能な値にする必要があります)。結果セットを取得した後は、そのクエリにおけるこのカラムの最大値の長さが field->max_length に渡されます。

戻り値

現在のカラムの MYSQL_FIELD 構造体。カラムが残っていない場合は NULL

エラー

ありません。

 
MYSQL_FIELD *field;

while((field = mysql_fetch_field(result)))
{
    printf("field name %s\n", field->name);
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.16 mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

説明

結果セットのすべての MYSQL_FIELD 構造体の配列を返します。各構造体には、結果セットに含まれる 1 つのカラムのフィールド定義が格納されています。

戻り値

結果セットに含まれるすべてのカラムの MYSQL_FIELD 構造体の配列。

エラー

ありません。

 
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;

num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
   printf("Field %u is %s\n", i, fields[i].name);
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.17 mysql_fetch_field_direct()

MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)

説明

フィールド番号 fieldnr で指定される結果セットのカラムのフィールド定義を MYSQL_FIELD 構造体として返します。この関数を使用すれば、任意のカラムの定義を取得できます。fieldnr の値は 0 から mysql_num_fields(result)-1 の範囲で指定します。

戻り値

指定したカラムの MYSQL_FIELD 構造体。

エラー

ありません。

 
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;

num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
    field = mysql_fetch_field_direct(result, i);
    printf("Field %u is %s\n", i, field->name);
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.18 mysql_fetch_lengths()

unsigned long *mysql_fetch_lengths(MYSQL_RES *result)

説明

結果セット内のカレントレコードのカラムの長さを返します。フィールド値をコピーしようとする場合、この関数を使用すれば strlen() を呼び出さなくても長さを取得できるので便利です。また、結果セットにバイナリデータが含まれている場合、strlen() はヌル文字が含まれるフィールドの長さを正しく返さないので、この関数を使用してデータサイズを調べる必要があります

空のカラムおよび NULL 値を含むカラムの長さは 0 です。この 2 つを区別する方法については、mysql_fetch_row() の説明を参照してください。

戻り値

各カラムのサイズ(ヌル終端文字は数えない)を表す unsigned long 整数の配列。エラーが発生した場合は NULL

エラー

mysql_fetch_lengths() は結果セットのカレントレコードでのみ有効です。mysql_fetch_row() を呼び出す前または結果セットのすべてのレコードを取得した後で呼び出された場合は NULL を返します。

 
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;

row = mysql_fetch_row(result);
if (row)
{
    num_fields = mysql_num_fields(result);
    lengths = mysql_fetch_lengths(result);
    for(i = 0; i < num_fields; i++)
    {
         printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
    }
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.19 mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

説明

結果セットの次のレコードを取得します。mysql_store_result() を呼び出した後に mysql_fetch_row() を使用する場合、取得するレコードが残っていなければ NULL を返します。mysql_use_result() を呼び出した後に mysql_fetch_row() を使用する場合、取得するレコードが残っていないか、またはエラーが発生したときに NULL を返します。

レコードに含まれる値の数は mysql_num_fields(result) によって取得します。mysql_fetch_row() を呼び出してその戻り値が row に格納されている場合、値へのポインタは row[0] から row[mysql_num_fields(result)-1] のように表されます。NULL ポインタは、レコードの値が NULL 値であることを示します。

mysql_fetch_lengths() を呼び出すと、レコードのフィールド値の長さを取得できます。空のフィールドおよび NULL を含むフィールドの長さはどちらも 0 ですが、そのフィールドのポインタを調べることによってその 2 つを区別できます。ポインタが NULL の場合、フィールドの値は NULL です。それ以外の場合、フィールドは空です。

戻り値

次のレコードの MYSQL_ROW 構造体。取得するレコードが残っていないか、エラーが発生した場合は NULL

エラー

注意: mysql_fetch_row() を 1 回呼び出してから、次に呼び出すまでの間にエラーがリセットされることはありません。

CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。
CR_UNKNOWN_ERROR
不明なエラーが発生した。

 
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
   }
   printf("\n");
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.20 mysql_field_count()

unsigned int mysql_field_count(MYSQL *mysql)

MySQL 3.22.24 より古いバージョンを使用している場合、この関数の代わりに unsigned int mysql_num_fields(MYSQL *mysql) を使用してください。

説明

現在の接続で最後に実行されたクエリの結果セットのカラム数を返します。

通常この関数は、mysql_store_result()NULL を返したとき(結果セットポインタが返されなかったとき)に使用します。この場合、mysql_field_count() を呼び出すことによって、mysql_store_result() が正常な処理として空の結果セットを返したのかどうかを判断できます。これによって、クライアントプログラムは、クエリが SELECT(または SELECT ライクな)ステートメントかどうかを知らなくても適切な処理を実行できます。以下の例に、この処理の実現方法を示します。

「11.1.12.1 mysql_query() が正常に終了した後で mysql_store_result()NULL を返す場合があるのはなぜか」 節 参照 。

戻り値

結果セットに含まれるフィールド数を表す unsigned 整数。

エラー

ありません。

 
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;

if (mysql_query(&mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&mysql);
    if (result)  // there are rows
    {
        num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else  // mysql_store_result() returned nothing; should it have?
    {
        if(mysql_field_count(&mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
        else // mysql_store_result() should have returned data
        {
            fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
        }
    }
}

mysql_field_count(&mysql) の呼び出し部分を mysql_errno(&mysql) に置き換える方法もあります。この場合、ステートメントが SELECT だったかどうかは、mysql_field_count() が返す値から推測するのではなく、mysql_store_result() が返すエラーを直接調べて判断します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.21 mysql_field_seek()

MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)

説明

フィールドカーソルの位置を指定されたオフセットに設定します。次に mysql_fetch_field() を呼び出すと、そのオフセットに関連付けられたカラムのフィールド定義を返します。

レコードの先頭にシークするには、offset 値に 0 を渡します。

戻り値

シークする前のフィールドカーソルの値。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.22 mysql_field_tell()

MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)

説明

最後に実行された mysql_fetch_field() で使用されたフィールドカーソルの位置を返します。この戻り値を、mysql_field_seek() に引数として渡すことができます。

戻り値

フィールドカーソルの現在のオフセット。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.23 mysql_free_result()

void mysql_free_result(MYSQL_RES *result)

説明

mysql_store_result()mysql_use_result()mysql_list_dbs() などが結果セットに割り当てたメモリを解放します。結果セットが必要なくなったら、mysql_free_result() を呼び出して、使用していたメモリを解放します。

戻り値

ありません。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.24 mysql_get_client_info()

char *mysql_get_client_info(void)

説明

クライアントのライブラリバージョンを表す文字列を返します。

戻り値

MySQL クライアントのライブラリバージョンを表す文字列。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.25 mysql_get_client_version()

unsigned long mysql_get_client_version(void)

説明

クライアントのライブラリバージョンを表す整数を返します。この値は XYYZZ という形式で表され、X はメジャーバージョン、YY はリリースレベル、ZZ はリリースレベル内のバージョン番号です。たとえば、40102 は、クライアントのライブラリバージョンが 4.1.2 であることを表します。

戻り値

MySQL クライアントのライブラリバージョンを表す整数。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.26 mysql_get_host_info()

char *mysql_get_host_info(MYSQL *mysql)

説明

使用している接続のタイプを表す文字列を返します。この文字列にはサーバのホスト名も含まれます。

戻り値

サーバのホスト名および接続タイプを表す文字列。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.27 mysql_get_proto_info()

unsigned int mysql_get_proto_info(MYSQL *mysql)

説明

現在の接続に使用しているプロトコルのバージョンを返します。

戻り値

現在の接続に使用しているプロトコルのバージョンを表す unsigned 整数。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.28 mysql_get_server_info()

char *mysql_get_server_info(MYSQL *mysql)

説明

サーバのバージョン番号を表す文字列を返します。

戻り値

サーバのバージョン番号を表す文字列。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.29 mysql_get_server_version()

unsigned long mysql_get_server_version(MYSQL *mysql)

説明

サーバのバージョン番号を整数として返します(4.1 の新機能)。

戻り値

MySQL サーバのバージョンを次の形式で表す番号。

main_version*10000 + minor_version *100 + sub_version

たとえば、バージョンが 4.1.0 の場合、戻り値は 40100 です。

この値を使用すると、クライアントプログラムはサーバのバージョンから特定の機能が存在するかどうかを簡単に判断できます。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.30 mysql_info()

char *mysql_info(MYSQL *mysql)

説明

最後に実行したクエリに関する情報を表す文字列を取得します。ただし、対象となるのは、以下の一覧に含まれるステートメントだけです。最後に実行したのが他のステートメントのクエリだった場合は、mysql_info()NULL を返します。文字列の形式は、以下に説明するように、クエリのタイプによって異なります。数字は例として示したものです。実際の文字列には実行したクエリに即した値が使用されます。

INSERT INTO ...SELECT ...
文字列の形式: Records: 100 Duplicates: 0 Warnings: 0
INSERT INTO ...VALUES (...),(...),(...)...
文字列の形式: Records: 3 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ...
文字列の形式: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE
文字列の形式: Records: 3 Duplicates: 0 Warnings: 0
UPDATE
文字列の形式: Rows matched: 40 Changed: 40 Warnings: 0

注意: mysql_info() は、INSERT ... VALUES ステートメントが複数レコードを挿入する形式の場合に限り(複数の値リストが指定された場合に限り)、NULL 以外の値を返します。

戻り値

最後に実行したクエリに関する情報を表す文字列。クエリの情報がない場合は NULL

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.31 mysql_init()

MYSQL *mysql_init(MYSQL *mysql)

説明

mysql_real_connect() に適応する MYSQL オブジェクトを割り当て、または初期化します。mysqlNULL ポインタを渡した場合、関数は新しいオブジェクトにメモリを割り当て、初期化し、それを返します。それ以外の値を渡した場合は、オブジェクトを初期化し、そのアドレスを返します。mysql_init() が新しいオブジェクトにメモリを割り当てた場合、そのメモリは mysql_close() を呼び出して接続をクローズする際に解放されます。

戻り値

初期化された MYSQL* ハンドル。新しいオブジェクトに割り当てる十分なメモリがなかった場合は NULL

エラー

メモリが不足していた場合は NULL を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.32 mysql_insert_id()

my_ulonglong mysql_insert_id(MYSQL *mysql)

説明

前回実行されたクエリで生成した AUTO_INCREMENT カラムの ID を返します。この関数は、AUTO_INCREMENT フィールドを含むテーブルに対して INSERT クエリを実行した後で使用します。

注意: mysql_insert_id() は、前回実行されたクエリで AUTO_INCREMENT 値が生成されなかった場合は、0 を返します。将来のためにその値を保存する必要がある場合は、それを生成するクエリの直後に mysql_insert_id() を呼び出す必要があります。

前回実行されたクエリがエラーを返した場合については、mysql_insert_id() の値は未定義です。

mysql_insert_id() は、AUTO_INCREMENT 値を生成するか、またはカラム値を LAST_INSERT_ID(expr) に設定する INSERT ステートメントおよび UPDATE ステートメントの実行後に更新されます。 「6.3.6.2 その他の各種関数」 節 参照 。

注意: SQL LAST_INSERT_ID() 関数の値には、必ず最後に生成された AUTO_INCREMENT 値が含まれます。この値はサーバに保持されるので、あるクエリを実行してから次のクエリを実行するまでの間にリセットされることはありません。

戻り値

前回実行されたクエリによって更新された AUTO_INCREMENT フィールドの値。現在の接続でまだ 1 回もクエリが実行されていなかった場合、または前回実行されたクエリで AUTO_INCREMENT 値が更新されなかった場合、0 を返します。

エラー

ありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.33 mysql_kill()

int mysql_kill(MYSQL *mysql, unsigned long pid)

説明

pid で指定するスレッドを強制終了するように、サーバに要求します。

戻り値

正常終了した場合は 0。エラーが発生した場合は 0 以外。

エラー

CR_COMMANDS_OUT_OF_SYNC
コマンドが正しい順序で実行されなかった。
CR_SERVER_GONE_ERROR
MySQL サーバがいなくなった。
CR_SERVER_LOST
クエリの実行中にサーバへの接続が切断された。
CR_UNKNOWN_ERROR
不明なエラーが発生した。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

11.1.3.34 mysql_list_dbs()

MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)

説明

サーバ上のデータベースから wild パラメータで指定される単純な正規表現に一致するデータベース名を検索し、結果セットとして返します。wild にはワイルドカード文字として `%' または `_' を使用できます。NULL ポインタを指定した場合はすべてのデータベース名が一致します。mysql_list_dbs() を呼び出すと、クエリ SHOW databases [LIKE wild] を実行した場合と同じ結果が得られます。

結果セットに割り当てられたメモリを解放するには、mysql_free_result() を呼び出す必要があります。

戻り値

正常終了した場合は MYSQL_RES 結果セット。エラーが発生した場合は NULL

エラー