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, используйте тип Cuint64_tвместо него. -
my_boolТип булевого значения, для значений, которые являются истинными (ненулевыми) или ложными (нулевыми). Тип
my_boolиспользовался до MySQL 8.0. Начиная с MySQL 8.0, используйте тип Cboolили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Поле не может быть 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соответствует набору символов исходного столбца таблицы или выражения. См. также .Для различения двоичных и недвоичных данных для строковых типов данных проверьте, равно ли значение
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_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.