Spec-Zone.ru › MySQL Connectors 1.0

5.2 Основные структуры данных C API

В этом разделе описываются структуры данных C API, отличные от тех, которые используются для подготовленных запросов. Дополнительную информацию об этих структурах см. в разделе 6.2, “C API структуры данных подготовленных запросов”.

  • MYSQL

    Эта структура представляет обработчик одного подключения к базе данных. Она используется для почти всех функций MySQL. Не пытайтесь создать копию структуры MYSQL. Нет гарантии, что такая копия будет работоспособна.

  • MYSQL_RES

    Эта структура представляет результат запроса, возвращающего строки (, , , ). Информация, возвращенная запросом, в дальнейшем в этом разделе называется результатом запроса.

  • MYSQL_ROW

    Это безопасное представление одной строки данных. В настоящее время оно реализовано как массив подсчитанных строковых значений в байтах. (Вы не можете рассматривать их как строки с завершением нулем, если значения полей могут содержать двоичные данные, так как такие значения могут содержать внутренние нулевые байты.) Строки получаются с помощью вызова mysql_fetch_row().

  • MYSQL_FIELD

    Эта структура содержит метаданные: информацию о поле, такую как имя, тип и размер поля. Ее члены подробно описаны далее в этом разделе. Вы можете получить структуры MYSQL_FIELD для каждого поля, вызвав mysql_fetch_field() многократно. Значения полей не являются частью этой структуры; они содержатся в структуре MYSQL_ROW.

  • MYSQL_FIELD_OFFSET

    Это безопасное представление смещения в списке полей MySQL. (Используется mysql_field_seek().) Смещения представляют номера полей в строке, начиная с нуля.

  • my_ulonglong

    Тип, используемый для количества строк и для mysql_affected_rows(), mysql_num_rows() и mysql_insert_id(). Этот тип обеспечивает диапазон от 0 до 1.84e19.

    Некоторые функции, возвращающие количество строк с помощью этого типа, возвращают -1 как беззнаковое значение, чтобы указать ошибку или исключительное состояние. Вы можете проверить на -1, сравнив возвращаемое значение с (my_ulonglong)-1 (или с (my_ulonglong)~0, что эквивалентно).

    На некоторых системах попытка вывести значение типа my_ulonglong не работает. Чтобы вывести такое значение, преобразуйте его в unsigned long и используйте формат вывода %lu. Пример:

    printf ("Number of rows: %lu\n",
            (unsigned long) mysql_num_rows(result));
    
  • my_bool

    Логический тип для значений, которые истинны (ненулевые) или ложны (нулевые).

Структура MYSQL_FIELD содержит члены, описанные в следующем списке. Определения в основном применяются к столбцам наборов результатов, таким как те, которые генерируются операторами. Структуры OUT также используются для предоставления метаданных для параметров OUT и INOUT, возвращаемых из хранимых процедур, выполняемых с помощью подготовленных запросов. Для таких параметров некоторые члены структуры имеют другое значение, чем для значений столбцов.

Подсказка

Чтобы интерактивно просмотреть значения члена MYSQL_FIELD для наборов результатов, вызовите команду mysql с параметром и выполните несколько тестовых запросов.

  • char * name

    Имя поля в виде строки с нулевым завершением. Если для поля был задан псевдоним с помощью предложения AS, то значение name — это псевдоним. Для параметра процедуры — это имя параметра.

  • char * org_name

    Имя поля в виде строки с нулевым завершением. Псевдонимы игнорируются. Для выражений значение — пустая строка. Для параметра процедуры — это имя параметра.

  • char * table

    Имя таблицы, содержащей это поле, если это не вычисляемое поле. Для вычисляемых полей значение table — пустая строка. Если столбец выбран из представления, то table содержит имя представления. Если таблице или представлению был задан псевдоним с помощью предложения AS, то значение table — это псевдоним. Для процедуры значение — пустая строка. Для параметра процедуры — это имя процедуры.

  • char * org_table

    Имя таблицы в виде строки с нулевым завершением. Псевдонимы игнорируются. Если столбец выбран из представления, то org_table содержит имя представления. Если столбец выбран из производной таблицы, то org_table содержит имя базовой таблицы. Если производная таблица оборачивает представление, то org_table всё равно содержит имя базовой таблицы. Если столбец является выражением, то org_table — пустая строка. Для процедуры значение — пустая строка. Для параметра процедуры значение — имя процедуры.

  • char * db

    Имя базы данных, из которой происходит поле, в виде строки с нулевым завершением. Если поле является вычисляемым, то db — пустая строка. Для процедуры значение — пустая строка. Для параметра процедуры — это имя базы данных, содержащей процедуру.

  • char * catalog

    Имя каталога. Это значение всегда "def".

  • char * def

    Значение по умолчанию этого поля в виде строки с нулевым завершением. Устанавливается только при использовании mysql_list_fields().

  • unsigned long length

    Ширина поля. Соответствует длине отображения в байтах.

    Сервер определяет значение length перед генерацией набора результатов, поэтому это минимальная длина, необходимая для типа данных, способного хранить наибольшее возможное значение из столбца результата, без предварительного знания фактических значений, которые будут произведены запросом для набора результатов.

    Для строковых столбцов значение length варьируется в зависимости от набора символов подключения. Например, если набор символов — latin1 (однобайтовый набор символов), значение length для запроса SELECT 'abc' составляет 3. Если набор символов — utf8mb4 (многобайтовый набор символов, в котором символы занимают до 4 байтов), то значение length составляет 12.

  • unsigned long max_length

    Максимальная ширина поля для набора результатов (длина в байтах самого длинного значения поля для строк, фактически находящихся в наборе результатов). При использовании mysql_store_result() или mysql_list_fields(), это содержит максимальную длину поля. Если используется mysql_use_result(), значение этой переменной равно нулю.

    Значение max_length — это длина строкового представления значений в наборе результатов. Например, если извлекается столбец и “наибольшее” значение — -12.345, то max_length составляет 7 (длина '-12.345').

    При использовании подготовленных запросов max_length по умолчанию не устанавливается, потому что для двоичного протокола длины значений зависят от типов значений в наборе результатов. (См. Раздел 6.2, «C API Prepared Statement Data Structures».) Если вам все же нужны значения max_length, включите параметр STMT_ATTR_UPDATE_MAX_LENGTH с помощью mysql_stmt_attr_set(), и длины будут установлены при вызове mysql_stmt_store_result(). (См. Раздел 6.4.3, «mysql_stmt_attr_set()» и Раздел 6.4.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 Поле является
    SET_FLAG Поле является
    BLOB_FLAG Поле является или (устаревший вариант)
    TIMESTAMP_FLAG Поле является (устаревший вариант)
    NUM_FLAG Поле числовое; см. дополнительные примечания после таблицы
    NO_DEFAULT_VALUE_FLAG Поле не имеет значения по умолчанию; см. дополнительные примечания после таблицы

    Некоторые из этих флагов указывают на информацию о типе данных и заменяются или используются совместно со значением MYSQL_TYPE_xxx в члене field->type, описанном позже:

    • Для проверки значений или проверьте, является ли type равным MYSQL_TYPE_BLOB или MYSQL_TYPE_TIMESTAMP. (Флаги BLOB_FLAG и TIMESTAMP_FLAG не нужны.)

    • Значения и возвращаются в виде строк. Для них проверьте, что значение type равно MYSQL_TYPE_STRING и что флаг ENUM_FLAG или SET_FLAG установлен в значении flags.

    NUM_FLAG указывает, что столбец числовой. Это включает столбцы с типом MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, MYSQL_TYPE_NULL, MYSQL_TYPE_LONGLONG, MYSQL_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
    IS_PRI_KEY(flags) Истинно, если это поле является первичным ключом
    IS_BLOB(flags) Истинно, если это поле является или (устаревший вариант; проверьте field->type вместо этого)
  • unsigned int decimals

    Количество десятичных знаков для числовых полей и точность дробных секунд для временных полей.

  • unsigned int charsetnr

    Идентификационный номер, указывающий пару набор символов/кодировка для поля.

    Обычно символьные значения в наборах результатов преобразуются в набор символов, указанный переменной системы. В этом случае charsetnr соответствует набору символов, указанному этой переменной. Преобразование наборов символов можно отключить, установив в значение NULL. В этом случае charsetnr соответствует набору символов исходного столбца таблицы или выражения. См. также .

    Чтобы отличить двоичные и недвоичные данные для строковых типов данных, проверьте, равно ли значение charsetnr 63. Если да, то набор символов — binary, что указывает на двоичные, а не недвоичные данные. Это позволяет вам отличить от , от , и типы от типов .

    Значения charsetnr совпадают с отображаемыми в столбце Id выражения или столбце ID таблицы INFORMATION_SCHEMA . Вы можете использовать эти источники информации, чтобы увидеть, какие значения 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_TINY поле
    MYSQL_TYPE_SHORT поле
    MYSQL_TYPE_LONG поле
    MYSQL_TYPE_INT24 поле
    MYSQL_TYPE_LONGLONG поле
    MYSQL_TYPE_DECIMAL или поле
    MYSQL_TYPE_NEWDECIMAL Точность математических вычислений или
    MYSQL_TYPE_FLOAT поле
    MYSQL_TYPE_DOUBLE или поле
    MYSQL_TYPE_BIT поле
    MYSQL_TYPE_TIMESTAMP поле
    MYSQL_TYPE_DATE поле
    MYSQL_TYPE_TIME поле
    MYSQL_TYPE_DATETIME поле
    MYSQL_TYPE_YEAR поле
    MYSQL_TYPE_STRING или поле
    MYSQL_TYPE_VAR_STRING или поле
    MYSQL_TYPE_BLOB или поле (используйте max_length для определения максимальной длины)
    MYSQL_TYPE_SET поле
    MYSQL_TYPE_ENUM поле
    MYSQL_TYPE_GEOMETRY Пространственное поле
    MYSQL_TYPE_NULL поле типа NULL

    Коды типов MYSQL_TYPE_TIME2, MYSQL_TYPE_DATETIME2 и MYSQL_TYPE_TIMESTAMP2 используются только на стороне сервера. Клиенты видят коды MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME и MYSQL_TYPE_TIMESTAMP.

    Вы можете использовать макрос IS_NUM(), чтобы проверить, имеет ли поле числовой тип. Передайте значение type в IS_NUM(), и оно вернёт TRUE, если поле является числовым:

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

    и значения возвращаются как строки. Для них проверьте, что значение type равно MYSQL_TYPE_STRING, и что флаг ENUM_FLAG или SET_FLAG установлен в значении flags.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/c-api-5.7-en/c-api-data-structures.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API