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.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.