Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


23.8.5 C API データ構造

このセクションでは、プリペアドステートメントに使用されるもの以外の C API データ構造について説明します。後者に関する情報については、セクション23.8.9「C API プリペアドステートメントデータ構造」を参照してください。

  • MYSQL

    この構造は 1 つのデータベース接続へのハンドルを表します。それはほとんどすべての MySQL 関数に使われます。MYSQL 構造のコピーを作成しようとしないでください。そのようなコピーが使用可能である保証はありません。

  • MYSQL_RES

    この構造は行 (SELECTSHOWDESCRIBEEXPLAIN) を返すクエリーの結果を表します。クエリーから返される情報は、このセクションの残りの部分で、結果セットと呼ばれています。

  • MYSQL_ROW

    これは 1 行のデータのタイプセーフな表現です。それは現在カウントされるバイト文字列の配列として実装されています。(フィールド値にバイナリデータが含まれている可能性がある場合、内部でそれらの値に NULL バイトが格納される可能性があるため、これらを NULL 終端文字列として扱うことはできません。)行は mysql_fetch_row() を呼び出すことによって取得します。

  • MYSQL_FIELD

    この構造には、メタデータ (フィールドの名前、型、サイズなどのフィールドに関する情報) が格納されます。そのメンバーについては、このセクションのあとの方でさらに詳しく説明しています。mysql_fetch_field() を繰り返し呼び出すことによって、フィールドごとに、MYSQL_FIELD 構造を取得できます。フィールド値はこの構造に含まれません。それらは MYSQL_ROW 構造に含まれます。

  • MYSQL_FIELD_OFFSET

    これは MySQL フィールドリスト内へのオフセットのタイプセーフな表現です。(mysql_field_seek() で使用されます。)オフセットは行内のゼロから始まるフィールド番号です。

  • 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));
  • my_bool

    true (ゼロ以外) または false (ゼロ) の値のブール型。

MYSQL_FIELD 構造には、次のリストに説明するメンバーが格納されます。この定義は、SELECT ステートメントによって生成されるものなど、主に結果セットのカラムに適用します。MySQL 5.6 で、MYSQL_FIELD 構造は、プリペアド CALL ステートメントを使用して実行されたストアドプロシージャーから返される OUT および INOUT パラメータのメタデータを提供するためにも使用されます。そのようなパラメータでは、構造メンバーの一部はカラム値の意味と異なる意味を持ちます。

  • char * name

    NULL 終端文字列としてのフィールドの名前。フィールドに AS 句によってエイリアスが与えられている場合、name の値はエイリアスになります。プロシージャーパラメータの場合は、パラメータ名。

  • char * org_name

    NULL 終端文字列としてのフィールドの名前。エイリアスは無視されます。式の場合、値は空の文字列です。プロシージャーパラメータの場合は、パラメータ名。

  • char * table

    このフィールドが計算されるフィールドでない場合、それを格納するテーブルの名前。計算されるフィールドの場合、table 値は空の文字列です。カラムがビューから選択される場合、table はそのビューを指定します。テーブルまたはビューに AS 句によってエイリアスが与えられている場合、table の値はエイリアスになります。UNION の場合、値は空の文字列です。プロシージャーパラメータの場合はプロシージャー名。

  • char * org_table

    NULL 終端文字列としてのテーブルの名前。エイリアスは無視されます。カラムがビューから選択される場合、org_table はそのビューを指定します。UNION の場合、値は空の文字列です。プロシージャーパラメータの場合はプロシージャー名。

  • char * db

    NULL 終端文字列としてのフィールドの取得元のデータベースの名前。フィールドが計算されるフィールドである場合、db は空の文字列になります。UNION の場合、値は空の文字列です。プロシージャーパラメータの場合は、プロシージャーを格納するデータベースの名前。

  • char * catalog

    カタログ名。この値は常に "def" です。

  • char * def

    NULL 終端文字列としてのこのフィールドのデフォルト値。これは mysql_list_fields() を使用する場合にのみ設定します。

  • unsigned long length

    フィールドの幅。これはバイト単位での表示の長さに対応します。

    サーバーは結果セットを生成する前に、length 値を判断するため、これは、結果セットに対するクエリーによって生成される実際の値を前もって知ることなく、結果カラムの可能性のある最大値を保持できる、データ型に必要な最小の長さになります。

  • unsigned long max_length

    結果セットのフィールドの最大幅 (結果セット内の実際の行の最大長フィールド値のバイト単位での長さ)。mysql_store_result() または mysql_list_fields() を使用した場合、これにはフィールドの最大長が含まれます。mysql_use_result() を使用した場合、この変数の値はゼロになります。

    max_length の値は、結果セット内の値の文字列表現の長さになります。たとえば、FLOAT カラムを取得し、最大幅の値が -12.345 である場合、max_length は 7 ('-12.345' の長さ) となります。

    プリペアドステートメントを使用している場合、バイナリプロトコルでは、値の長さが結果セット内の値の型によって異なるため、max_length はデフォルトで設定されません。(セクション23.8.9「C API プリペアドステートメントデータ構造」を参照してください。)とにかく max_length 値が必要な場合、mysql_stmt_attr_set()STMT_ATTR_UPDATE_MAX_LENGTH オプションを有効にすると、mysql_stmt_store_result() を呼び出したときにその長さが設定されます。(セクション23.8.11.3「mysql_stmt_attr_set()」およびセクション23.8.11.28「mysql_stmt_store_result()」を参照してください。)

  • unsigned int name_length

    name の長さ。

  • unsigned int org_name_length

    org_name の長さ。

  • unsigned int table_length

    table の長さ。

  • unsigned int org_table_length

    org_table の長さ。

  • unsigned int db_length

    db の長さ。

  • unsigned int catalog_length

    catalog の長さ。

  • unsigned int def_length

    def の長さ。

  • unsigned int flags

    フィールドを説明するビットフラグ。flags 値は、次の表に示すゼロ以上のビットセットを持つ可能性があります。

    フラグ値 フラグの説明
    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 (非推奨) です
    NUM_FLAG フィールドは数値です。表のあとの補注を参照してください
    NO_DEFAULT_VALUE_FLAG フィールドにはデフォルト値がありません。表のあとの補注を参照してください

    これらのフラグの一部はデータ型情報を示し、後述する field->type メンバーの MYSQL_TYPE_xxx 値によって置き換えられるか、一緒に使用されます。

    • BLOB または TIMESTAMP 値をチェックするには、typeMYSQL_TYPE_BLOB であるか、または MYSQL_TYPE_TIMESTAMP であるかをチェックします。(BLOB_FLAG および TIMESTAMP_FLAG フラグは必要ありません。)

    • ENUM および SET 値は文字列として返されます。これらについては、type 値が MYSQL_TYPE_STRING で、flags 値に ENUM_FLAG または SET_FLAG フラグが設定されていることを確認します。

    NUM_FLAG はカラムが数値であることを示します。これには、MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMALMYSQL_TYPE_TINYMYSQL_TYPE_SHORTMYSQL_TYPE_LONGMYSQL_TYPE_FLOATMYSQL_TYPE_DOUBLEMYSQL_TYPE_NULLMYSQL_TYPE_LONGLONGMYSQL_TYPE_INT24、および MYSQL_TYPE_YEAR の型のカラムが含まれます。

    NO_DEFAULT_VALUE_FLAG は、カラムの定義に DEFAULT 句がないことを示しています。これは NULL カラム (そのようなカラムは NULL のデフォルトを持つため) または AUTO_INCREMENT カラム (これは暗黙的なデフォルト値を持ちます) には適用されません。

    次の例に flags 値の一般的な使用を示します。

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

    次の表に示す便利なマクロを使用して、flags 値のブールステータスを判断できます。

    フラグのステータス 説明
    IS_NOT_NULL(flags) このフィールドが NOT NULL と定義されている場合は true
    IS_PRI_KEY(flags) このフィールドが主キーである場合は true
    IS_BLOB(flags) このフィールドが BLOB または TEXT (非推奨、代わりに field->type をテストしてください) の場合は true
  • unsigned int decimals

    数値フィールドの小数点以下の桁数および (MySQL 5.6.4 以降) 時間フィールドの小数秒の精度。

  • unsigned int charsetnr

    フィールドの文字セット/照合順序ペアを示す ID 番号。

    通常、結果セットの文字値は、character_set_results システム変数で示された文字セットに変換されます。この場合、charsetnr はその変数で示された文字セットに対応します。文字セットの変換は character_set_resultsNULL に設定することによってサポートできます。この場合、charsetnr は元のテーブルカラムまたは式の文字セットに対応します。セクション10.1.4「接続文字セットおよび照合順序」も参照してください。

    文字列データ型のバイナリおよび非バイナリデータを区別するには、charsetnr 値が 63 であるかどうかをチェックします。その場合、文字セットは binary で、これは非バイナリデータではなく、バイナリを示します。これにより、BINARYCHARVARBINARYVARCHAR、および BLOB 型と TEXT 型を区別できます。

    charsetnr 値は SHOW COLLATION ステートメントの Id カラムまたは INFORMATION_SCHEMA COLLATIONS テーブルの ID カラムに表示される値と同じです。それらの情報ソースを使用して、特定の charsetnr 値がどの文字セットと照合順序を示しているかを確認できます。

    mysql> SHOW COLLATION WHERE Id = 63;
    +-----------+---------+----+---------+----------+---------+
    | Collation | Charset | Id | Default | Compiled | Sortlen |
    +-----------+---------+----+---------+----------+---------+
    | binary    | binary  | 63 | Yes     | Yes      |       1 |
    +-----------+---------+----+---------+----------+---------+
    
    mysql> SELECT COLLATION_NAME, CHARACTER_SET_NAME
        -> FROM INFORMATION_SCHEMA.COLLATIONS WHERE ID = 33;
    +-----------------+--------------------+
    | COLLATION_NAME  | CHARACTER_SET_NAME |
    +-----------------+--------------------+
    | utf8_general_ci | utf8               |
    +-----------------+--------------------+
  • enum enum_field_types type

    フィールドの型。type 値は次の表に示す MYSQL_TYPE_ シンボルのいずれかになります。

    型の値 型の説明
    MYSQL_TYPE_TINY TINYINT フィールド
    MYSQL_TYPE_SHORT SMALLINT フィールド
    MYSQL_TYPE_LONG INTEGER フィールド
    MYSQL_TYPE_INT24 MEDIUMINT フィールド
    MYSQL_TYPE_LONGLONG BIGINT フィールド
    MYSQL_TYPE_DECIMAL DECIMAL または NUMERIC フィールド
    MYSQL_TYPE_NEWDECIMAL 高精度計算 DECIMAL または NUMERIC
    MYSQL_TYPE_FLOAT FLOAT フィールド
    MYSQL_TYPE_DOUBLE DOUBLE または REAL フィールド
    MYSQL_TYPE_BIT BIT フィールド
    MYSQL_TYPE_TIMESTAMP TIMESTAMP フィールド
    MYSQL_TYPE_DATE DATE フィールド
    MYSQL_TYPE_TIME TIME フィールド
    MYSQL_TYPE_DATETIME DATETIME フィールド
    MYSQL_TYPE_YEAR YEAR フィールド
    MYSQL_TYPE_STRING CHAR または BINARY フィールド
    MYSQL_TYPE_VAR_STRING VARCHAR または VARBINARY フィールド
    MYSQL_TYPE_BLOB BLOB または TEXT フィールド (max_length を使用して最大長を判断します)
    MYSQL_TYPE_SET SET フィールド
    MYSQL_TYPE_ENUM ENUM フィールド
    MYSQL_TYPE_GEOMETRY 空間フィールド
    MYSQL_TYPE_NULL NULL 型フィールド

    MYSQL_TYPE_TIME2MYSQL_TYPE_DATETIME2、および MYSQL_TYPE_TIMESTAMP2 タイプコードはサーバー側でのみ使用されます。クライアントは、MYSQL_TYPE_TIMEMYSQL_TYPE_DATETIME、および MYSQL_TYPE_TIMESTAMP コードを参照します。

    IS_NUM() マクロを使用して、フィールドが数値型を持つかどうかをテストできます。type 値を IS_NUM() に渡すと、それはフィールドが数値である場合、TRUE と評価します。

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

    ENUM および SET 値は文字列として返されます。これらについては、type 値が MYSQL_TYPE_STRING で、flags 値に ENUM_FLAG または SET_FLAG フラグが設定されていることを確認します。


User Comments
Sign Up Login You must be logged in to post a comment.