6.2 Структуры данных подготовленных запросов C API
Подготовленные запросы используют несколько структур данных:
Для получения обработчика запроса передайте обработчик соединения
MYSQLв функциюmysql_stmt_init(), которая вернёт указатель на структуру данныхMYSQL_STMT. Эта структура используется для дальнейших операций с запросом. Для указания запроса для подготовки передайте указательMYSQL_STMTи строку запроса в функциюmysql_stmt_prepare().-
Для предоставления входных параметров для подготовленного запроса настройте структуры
MYSQL_BINDи передайте их в функциюmysql_stmt_bind_param()илиmysql_stmt_bind_named_param(). Для получения значений выходных столбцов настройте структурыMYSQL_BINDи передайте их в функциюmysql_stmt_bind_result().Структуры
MYSQL_BINDтакже используются с функциейmysql_bind_param(), что позволяет определять атрибуты, которые применяются к следующему запросу, отправленному на сервер. Структура
MYSQL_TIMEиспользуется для передачи временных данных в обоих направлениях.
Ниже подробно описаны типы данных подготовленных запросов. Для примеров использования см. Раздел 6.4.11, «mysql_stmt_execute()», и Раздел 6.4.12, «mysql_stmt_fetch()».
-
MYSQL_STMTЭта структура — обработчик подготовленного запроса. Обработчик создаётся путём вызова функции
mysql_stmt_init(), которая возвращает указатель на структуруMYSQL_STMT. Обработчик используется для всех последующих операций с запросом до тех пор, пока вы не закроете его функциейmysql_stmt_close(), после чего обработчик становится недопустимым и больше не должен использоваться.Структура
MYSQL_STMTне содержит членов, предназначенных для использования приложениями. Приложения не должны пытаться скопировать структуруMYSQL_STMT. Нет гарантии, что такое копирование будет применимо.Несколько обработчиков запросов могут быть связаны с одним соединением. Предел количества обработчиков зависит от доступных системных ресурсов.
-
MYSQL_BINDЭта структура используется как для ввода операторов (значений данных, отправляемых на сервер), так и для вывода (значений результатов, возвращаемых сервером):
Для ввода используйте структуры
MYSQL_BINDсmysql_bind_param()для определения атрибутов запроса. (В дальнейшем обсуждении любые упоминания параметров оператора для подготовленных операторов также относятся к атрибутам запроса.)Для вывода используйте структуры
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_named_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.12, «mysql_stmt_fetch()», для некоторых стратегий.
-
bool *is_nullЭтот член указывает на переменную
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 = (bool*) 0и установите другие члены соответствующим образом для привязываемой переменной.Во всех других случаях установите другие члены соответствующим образом и установите
is_nullв адрес переменнойbool. Установите значение этой переменной в true или false соответственно, чтобы указать, является ли соответствующее значение данныхNULLилиNOT NULL.
При выводе, когда вы извлекаете строку, MySQL устанавливает значение, указанное по адресу
is_null, в true или false в зависимости от того, является ли возвращаемое значение столбца набора результатов из оператораNULLили нет. -
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 выполняет правильное преобразование между знаковыми и беззнаковыми значениями в обоих направлениях, хотя выдается предупреждение, если происходит усечение. -
bool *errorДля вывода установите этот член для указания на переменную
bool, чтобы получить информацию об усечении для параметра, сохраненного там после операции извлечения строки. Когда отчет об усечении включен,mysql_stmt_fetch()возвращаетMYSQL_DATA_TRUNCATED, а*errorв структурах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Секунда bool negФлаг булевого типа, указывающий, является ли время отрицательным unsigned long second_partДробная часть секунды в микросекундах Используются только те части структуры
MYSQL_TIME, которые применимы к заданному типу временной величины. Элементыyear,monthиdayиспользуются для , , и значений. Элементыhour,minuteиsecondиспользуются для , , и значений. См. Раздел 3.6.4, «Обработка значений даты и времени в подготовленных запросах».
© 2025 Oracle
Licensed under the GPLv2 License.