6.2 Структуры данных подготовленных запросов C API
Подготовленные запросы используют несколько структур данных:
Для получения обработчика запроса передайте обработчик подключения
MYSQLв функциюmysql_stmt_init(), которая возвращает указатель на структуру данныхMYSQL_STMT. Эта структура используется для дальнейших операций с запросом. Для указания запроса для подготовки передайте указательMYSQL_STMTи строку запроса в функциюmysql_stmt_prepare().Для предоставления входных параметров подготовленному запросу настройте структуры
MYSQL_BINDи передайте их в функциюmysql_stmt_bind_param(). Для получения значений выходных столбцов настройте структурыMYSQL_BINDи передайте их в функциюmysql_stmt_bind_result().Структура
MYSQL_TIMEиспользуется для передачи временных данных в обоих направлениях.
Ниже подробно описаны типы данных подготовленных запросов. Примеры их использования см. в разделе 6.4.10, «mysql_stmt_execute()» и разделе 6.4.11, «mysql_stmt_fetch()».
-
MYSQL_STMTЭта структура является обработчиком подготовленного запроса. Обработчик создается путем вызова функции
mysql_stmt_init(), которая возвращает указатель на структуруMYSQL_STMT. Обработчик используется для всех последующих операций с запросом до момента его закрытия с помощью функцииmysql_stmt_close(), после чего обработчик становится недействительным и больше не должен использоваться.Структура
MYSQL_STMTне содержит членов, предназначенных для использования приложением. Приложения не должны пытаться копировать структуруMYSQL_STMT. Нет гарантии, что такая копия будет работоспособной.Несколько обработчиков запросов могут быть связаны с одним подключением. Ограничение на количество обработчиков зависит от доступных системных ресурсов.
-
MYSQL_BINDЭта структура используется как для ввода запроса (значения данных, отправляемые на сервер), так и для вывода (значения результатов, возвращаемые сервером):
Для ввода используйте структуры
MYSQL_BINDсmysql_stmt_bind_param()для привязки значений параметров к буферам, используемымmysql_stmt_execute().Для вывода используйте структуры
MYSQL_BINDсmysql_stmt_bind_result()для привязки буферов к столбцам набора результатов, для использования при извлечении строк с помощьюmysql_stmt_fetch().
Для использования структуры
MYSQL_BINDобнулите её содержимое для инициализации, а затем установите её члены соответствующим образом. Например, для объявления и инициализации массива из трёх структурMYSQL_BINDиспользуйте этот код:MYSQL_BIND bind[3]; memset(bind, 0, sizeof(bind));
Структура
MYSQL_BINDсодержит следующие члены для использования приложениями. Для многих членов способ использования зависит от того, используется ли структура для ввода или вывода.-
enum enum_field_types buffer_typeТип буфера. Этот член указывает тип данных переменной языка C, привязанной к параметру запроса или столбцу набора результатов. Для ввода
buffer_typeуказывает тип переменной, содержащей значение, которое будет отправлено на сервер. Для вывода он указывает тип переменной, в которую должно быть сохранено значение, полученное от сервера. Для допустимых значенийbuffer_typeсм. Раздел 6.2.1, «Типы данных C API подготовленных запросов». -
void *bufferУказатель на буфер, используемый для передачи данных. Это адрес переменной языка C.
Для ввода
bufferявляется указателем на переменную, в которой хранится значение данных для параметра запроса. При вызовеmysql_stmt_execute(), MySQL использует значение, хранящееся в переменной, вместо соответствующего маркера параметра в запросе (указанный с помощью?в строке запроса).Для вывода
bufferявляется указателем на переменную, в которую возвращается значение столбца набора результатов. При вызовеmysql_stmt_fetch(), MySQL сохраняет значение столбца из текущей строки набора результатов в этой переменной. Вы можете получить доступ к значению при возвращении вызова.Для минимизации необходимости MySQL выполнять преобразование типов между значениями переменных языка C на стороне клиента и значениями SQL на стороне сервера, используйте переменные языка C, которые имеют типы, аналогичные типам соответствующих значений SQL:
Для числовых типов данных
bufferдолжен указывать на переменную соответствующего числового типа языка C. Для целочисленных переменных (которые могут бытьcharдля однобайтовых значений или целочисленного типа для больших значений), вы также должны указать, имеет ли переменная атрибутunsigned, установив членis_unsigned, описанный ниже.Для символьных (небинарных) и бинарных строковых типов данных
bufferдолжен указывать на символьный буфер.Для типов данных даты и времени
bufferдолжен указывать на структуруMYSQL_TIME.
Для рекомендаций по сопоставлению типов языка C и типов SQL и примечаний по преобразованиям типов см. Раздел 6.2.1, «Типы данных C API подготовленных запросов» и Раздел 6.2.2, «Преобразование типов C API подготовленных запросов».
-
unsigned long buffer_lengthФактический размер
*bufferв байтах. Это указывает на максимальное количество данных, которое может храниться в буфере. Для символьных и бинарных данных языка C значениеbuffer_lengthопределяет длину*bufferпри использовании сmysql_stmt_bind_param()для указания входных значений или максимальное количество байтов выходных данных, которые могут быть извлечены в буфер при использовании сmysql_stmt_bind_result(). -
unsigned long *lengthУказатель на переменную
unsigned long, которая указывает фактическое количество байтов данных, хранящихся в*buffer.lengthиспользуется для символьных или бинарных данных языка C.Для привязки входных данных параметров установите
*length, чтобы указать фактическую длину значения параметра, хранящегося в*buffer. Это используетсяmysql_stmt_execute().Для привязки выходных значений MySQL устанавливает
*lengthпри вызовеmysql_stmt_fetch(). Значение возвратаmysql_stmt_fetch()определяет, как интерпретировать длину:Если возвращаемое значение равно 0,
*lengthуказывает фактическую длину значения параметра.Если возвращаемое значение равно
MYSQL_DATA_TRUNCATED,*lengthуказывает несокращенную длину значения параметра. В этом случае минимум из*lengthиbuffer_lengthуказывает фактическую длину значения.
lengthигнорируется для числовых и временных типов данных, потому что значениеbuffer_typeопределяет длину значения данных.Если вам нужно определить длину возвращаемого значения перед его извлечением, см. Раздел 6.4.11, «mysql_stmt_fetch()», для некоторых стратегий.
-
my_bool *is_nullЭтот член указывает на переменную
my_bool, которая имеет значение true, если значениеNULL, и false, если оно неNULL. Для ввода установите*is_nullв значение true, чтобы указать, что вы передаёте значениеNULLкак параметр запроса.is_nullявляется указателем на булеву переменную, а не булевым значением, чтобы обеспечить гибкость в способе указанияNULLзначений:Если ваши значения данных всегда
NULL, используйтеMYSQL_TYPE_NULLкак значениеbuffer_typeпри привязке столбца. Другие членыMYSQL_BIND, включаяis_null, не имеют значения.Если ваши значения данных всегда
NOT NULL, установитеis_null = (my_bool*) 0и установите другие члены соответствующим образом для переменной, которую вы привязываете.Во всех остальных случаях установите другие члены соответствующим образом и установите
is_nullв адрес переменнойmy_bool. Установите значение этой переменной в true или false соответствующим образом между выполнениями, чтобы указать, является ли соответствующее значение данныхNULLилиNOT NULLсоответственно.
Для вывода, когда вы извлекаете строку, MySQL устанавливает значение, на которое указывает
is_null, в true или false в зависимости от того, является ли возвращаемое из запроса значение столбца набора результатовNULLили нет. -
my_bool is_unsignedЭтот член применяется для переменных языка C с типами данных, которые могут быть
unsigned(char,short int,int,long long int). Установитеis_unsignedв значение true, если переменная, на которую указываетbuffer, являетсяunsigned, и в false в противном случае. Например, если вы привязываете переменнуюsigned charкbuffer, укажите код типаMYSQL_TYPE_TINYи установитеis_unsignedв false. Если вы привязываете вместо этогоunsigned char, код типа остается тем же, ноis_unsignedдолжно быть true. (Дляcharне определено, является ли он знаковым или беззнаковым, поэтому лучше явно указать знаковое представление, используяsigned charилиunsigned char.)is_unsignedприменяется только к переменной языка C на стороне клиента. Это ничего не говорит о знаковом представлении соответствующего значения SQL на стороне сервера. Например, если вы используете переменнуюintдля указания значения для столбцаBIGINT UNSIGNED,is_unsignedдолжно быть false, потому чтоintявляется знаковым типом. Если вы используете переменнуюunsigned intдля указания значения для столбца,is_unsignedдолжно быть true, потому чтоunsigned intявляется беззнаковым типом. MySQL выполняет правильное преобразование между знаковыми и беззнаковыми значениями в обоих направлениях, хотя предупреждение возникает, если происходит усечение. -
my_bool *errorДля вывода установите этот член для указания на переменную
my_bool, чтобы получить информацию об усечении для параметра, сохраненного там после операции извлечения строки. При включённом отслеживании усеченияmysql_stmt_fetch()возвращаетMYSQL_DATA_TRUNCATEDи*errorимеет значение true в структурахMYSQL_BINDдля параметров, в которых произошло усечение. Усечение указывает на потерю знака или значащих цифр, или что строка была слишком длинной для помещения в столбец. Отслеживание усечения включено по умолчанию, но может быть настроено путём вызоваmysql_options()с параметромMYSQL_REPORT_DATA_TRUNCATION.
-
MYSQL_TIMEЭта структура используется для отправки и получения данных , , , напрямую на сервер и с сервера. Установите член
buffer, чтобы он указывал на структуруMYSQL_TIME, и установите членbuffer_typeструктурыMYSQL_BINDна один из временных типов (MYSQL_TYPE_TIME,MYSQL_TYPE_DATE,MYSQL_TYPE_DATETIME,MYSQL_TYPE_TIMESTAMP).Структура
MYSQL_TIMEсодержит члены, перечисленные в следующей таблице.Член Описание unsigned int yearГод unsigned int monthМесяц года unsigned int dayДень месяца unsigned int hourЧас дня unsigned int minuteМинута часа unsigned int secondСекунда минуты my_bool negФлаг булевого типа, указывающий, является ли время отрицательным unsigned long second_partДробная часть секунды в микросекундах Используются только те части структуры
MYSQL_TIME, которые применимы к заданному типу временной метки. Элементыyear,monthиdayиспользуются для , , и значений. Элементыhour,minuteиsecondиспользуются для , , и значений. См. Раздел 3.6.3, «Обработка Prepared Statement дат и временных значений».
© 2025 Oracle
Licensed under the GPLv2 License.