Spec-Zone.ru › MySQL Connectors 1.0

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

В этом разделе описываются структуры данных API C, отличные от тех, которые используются для подготовленных запросов, асинхронного интерфейса или интерфейса потока репликации. Для информации об этих структурах см. Раздел 6.2, «Структуры данных API C для подготовленных запросов», Раздел 7.2, «Структуры данных API C для асинхронного интерфейса» и Раздел 10.2, «Структуры данных API C для бинарного журнала».

  • 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

    Тип, используемый для 64-битных беззнаковых целых чисел. Тип my_ulonglong использовался до MySQL 8.0.18. Начиная с MySQL 8.0.18, используйте тип C uint64_t вместо него.

  • my_bool

    Тип булевого значения, для значений, которые являются истинными (ненулевыми) или ложными (нулевыми). Тип my_bool использовался до MySQL 8.0. Начиная с MySQL 8.0, используйте тип C bool или int вместо него.

    Примечание

    Изменение с my_bool на bool означает, что заголовочный файл mysql.h требует компилятора C++ или C99 для компиляции.

Структура MYSQL_FIELD содержит члены, описанные в следующем списке. Определения в первую очередь относятся к столбцам наборов результатов, таким как те, которые генерируются запросами. Структуры MYSQL_FIELD также используются для предоставления метаданных для параметров 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 Подготовленные Запросы Структуры Данных».) Если вам все же нужны значения max_length, включите опцию STMT_ATTR_UPDATE_MAX_LENGTH с помощью mysql_stmt_attr_set(), и длины будут установлены при вызове mysql_stmt_store_result(). (См. Раздел 6.4.3, «mysql_stmt_attr_set()», и Раздел 6.4.29, «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-8.4-en/c-api-data-structures.html

Spec-Zone.ru

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