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Поле не может быть NULLPRI_KEY_FLAGПоле является частью первичного ключа UNIQUE_KEY_FLAGПоле является частью уникального ключа MULTIPLE_KEY_FLAGПоле является частью не уникального ключа UNSIGNED_FLAGПоле имеет атрибут UNSIGNEDZEROFILL_FLAGПоле имеет атрибут ZEROFILLBINARY_FLAGПоле имеет атрибут BINARYAUTO_INCREMENT_FLAGПоле имеет атрибут AUTO_INCREMENTENUM_FLAGПоле является SET_FLAGПоле является BLOB_FLAGПоле является или (устаревший вариант) TIMESTAMP_FLAGПоле является (устаревший вариант) NUM_FLAGПоле числовое; см. дополнительные примечания после таблицы NO_DEFAULT_VALUE_FLAGПоле не имеет значения по умолчанию; см. дополнительные примечания после таблицы Некоторые из этих флагов указывают на информацию о типе данных и заменяются или используются совместно со значением
MYSQL_TYPE_в членеxxxfield->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 NULLIS_PRI_KEY(flags)Истинно, если это поле является первичным ключом IS_BLOB(flags)Истинно, если это поле является или (устаревший вариант; проверьте field->typeвместо этого) -
unsigned int decimalsКоличество десятичных знаков для числовых полей и точность дробных секунд для временных полей.
-
unsigned int charsetnrИдентификационный номер, указывающий пару набор символов/кодировка для поля.
Обычно символьные значения в наборах результатов преобразуются в набор символов, указанный переменной системы. В этом случае
charsetnrсоответствует набору символов, указанному этой переменной. Преобразование наборов символов можно отключить, установив в значениеNULL. В этом случаеcharsetnrсоответствует набору символов исходного столбца таблицы или выражения. См. также .Чтобы отличить двоичные и недвоичные данные для строковых типов данных, проверьте, равно ли значение
charsetnr63. Если да, то набор символов —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_NAMEFROM 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.