5.1 Обзор базового интерфейса C API
Программы приложений должны использовать данный общий алгоритм взаимодействия с MySQL через клиентскую библиотеку:
Инициализируйте клиентскую библиотеку MySQL, вызвав
mysql_library_init(). Эта функция присутствует как в клиентской библиотеке C API MySQL, так и в библиотеке встраиваемого сервера, поэтому она используется независимо от того, компилируется ли обычная клиентская программа с флагомlibmysqlclientили приложение встраиваемого сервера с флагомlibmysqld.Инициализируйте обработчик подключения, вызвав
mysql_init(), и подключитесь к серверу, вызвавmysql_real_connect().Выполняйте SQL-запросы и обрабатывайте результаты. (Более подробная информация о выполнении этого действия приведена ниже).
Закройте подключение к серверу MySQL, вызвав
mysql_close().Завершите использование клиентской библиотеки MySQL, вызвав
mysql_library_end().
Целью вызова mysql_library_init() и mysql_library_end() является правильная инициализация и завершение работы клиентской библиотеки MySQL. Для приложений, связанных с клиентской библиотекой, это обеспечивает улучшенное управление памятью. Если не вызвать mysql_library_end(), блок памяти останется выделенным. (Это не увеличивает потребление памяти приложением, но некоторые детекторы утечек памяти могут выдавать предупреждения). Для приложений, связанных со встроенным сервером, эти вызовы запускают и останавливают сервер.
В среде без многопоточности вызов mysql_library_init() можно опустить, так как mysql_init() вызовет его автоматически при необходимости. Однако, mysql_library_init() не является потокобезопасной в многопоточной среде, и, следовательно, не является потокобезопасной и mysql_init(), которая вызывает mysql_library_init(). Вы должны либо вызвать mysql_library_init() перед созданием потоков, либо использовать мьютекс для защиты вызова, независимо от того, вызываете ли вы mysql_library_init() или косвенно через mysql_init(). Это должно быть сделано до любого другого вызова клиентской библиотеки.
Для подключения к серверу вызовите mysql_init() для инициализации обработчика подключения, а затем вызовите mysql_real_connect() с этим обработчиком (вместе с другими данными, такими как имя хоста, имя пользователя и пароль). Когда вы закончите с подключением, вызовите mysql_close() для его завершения. Не используйте обработчик после его закрытия.
При подключении mysql_real_connect() устанавливает флаг reconnect (часть структуры MYSQL) в значение 0. Вы можете использовать опцию MYSQL_OPT_RECONNECT к mysql_options() для управления поведением повторного подключения. Установка флага в 1 заставляет клиента пытаться повторно подключиться к серверу, прежде чем отказаться, если операция не может быть выполнена из-за потери подключения.
Пока активен процесс подключения, клиент может отправлять SQL-запросы на сервер с помощью mysql_real_query() или mysql_query(). Разница между ними в том, что mysql_query() ожидает, что запрос будет задан как строка с нулевым окончанием, в то время как mysql_real_query() ожидает строку с указанием длины. Если строка содержит двоичные данные (которые могут включать нулевые байты), вы должны использовать mysql_real_query().
Для каждого запроса, отличного от запроса (например, , , ), вы можете узнать, сколько строк было изменено (затронуто), вызвав mysql_affected_rows().
Для запросов вы получаете выбранные строки как набор результатов. (Обратите внимание, что некоторые операторы похожи на запросы, возвращая строки. К ним относятся , , и . Обрабатывайте эти операторы так же, как и операторы запросов.)
Существует два способа, которыми клиент может обработать наборы результатов. Один способ — извлечь весь набор результатов сразу, вызвав mysql_store_result(). Эта функция получает от сервера все строки, возвращенные запросом, и хранит их на клиенте. Второй способ — инициировать извлечение набора результатов строка за строкой, вызвав mysql_use_result(). Эта функция инициирует извлечение, но не извлекает строки с сервера.
В обоих случаях вы получаете доступ к строкам, вызвав mysql_fetch_row(). С помощью mysql_store_result(), mysql_fetch_row() обращается к строкам, которые были ранее извлечены с сервера. С помощью mysql_use_result(), mysql_fetch_row() фактически извлекает строку с сервера. Информация о размере данных в каждой строке доступна при вызове mysql_fetch_lengths().
После завершения работы с набором результатов вызовите mysql_free_result() для освобождения памяти, используемой для него.
Два механизма извлечения дополняют друг друга. Выберите подход, наиболее подходящий для каждого приложения. На практике клиенты чаще используют mysql_store_result().
Преимущество mysql_store_result() заключается в том, что, поскольку все строки уже извлечены на клиенте, вы можете не только получать доступ к строкам последовательно, но и перемещаться вперед и назад в наборе результатов с помощью mysql_data_seek() или mysql_row_seek() для изменения текущей позиции строки в наборе результатов. Вы также можете узнать количество строк, вызвав mysql_num_rows(). С другой стороны, требования к памяти для mysql_store_result() могут быть очень высокими для больших наборов результатов, и у вас есть большая вероятность столкнуться с ошибками недостатка памяти.
Преимущество mysql_use_result() заключается в том, что клиенту требуется меньше памяти для набора результатов, так как он поддерживает только одну строку за раз (и из-за меньшей нагрузки на выделение памяти, mysql_use_result() может работать быстрее). Недостатки: вам нужно быстро обработать каждую строку, чтобы избежать блокирования сервера, у вас нет произвольного доступа к строкам в наборе результатов (вы можете получить доступ только последовательно), и количество строк в наборе результатов неизвестно, пока вы не извлечете их все. Кроме того, вам обязательно нужно получить все строки, даже если вы обнаружите в процессе извлечения искомую информацию.
API позволяет клиентам должным образом реагировать на запросы (получая строки только по мере необходимости), не зная, является ли запрос . Вы можете сделать это, вызвав mysql_store_result() после каждого mysql_real_query() (или mysql_query()). Если вызов набора результатов успешен, запрос был и вы можете прочитать строки. Если вызов набора результатов терпит неудачу, вызовите mysql_field_count(), чтобы определить, ожидался ли на самом деле результат. Если mysql_field_count() возвращает ноль, запрос не вернул данных (указывая, что это был , , , и так далее), и не ожидалось возвращения строк. Если mysql_field_count() ненулевое, запрос должен был вернуть строки, но не сделал этого. Это указывает на то, что запрос был и потерпел неудачу. Обратитесь к описанию mysql_field_count() для примера, как это можно сделать.
Обе функции mysql_store_result() и mysql_use_result() позволяют получить информацию о полях набора результатов (количество полей, их имена и типы и так далее). Вы можете получить доступ к информации о полях последовательно в строке, вызывая функцию mysql_fetch_field() повторно или по номеру поля в строке, вызывая mysql_fetch_field_direct(). Текущее положение курсора поля может быть изменено с помощью вызова функции mysql_field_seek(). Установка курсора поля влияет на последующие вызовы функции mysql_fetch_field(). Вы также можете получить информацию о всех полях сразу, вызвав mysql_fetch_fields().
Для обнаружения и сообщения об ошибках MySQL предоставляет доступ к информации об ошибках с помощью функций mysql_errno() и mysql_error(). Эти функции возвращают код ошибки или сообщение об ошибке для последней вызванной функции, которая может преуспеть или потерпеть неудачу, что позволяет определить, когда произошла ошибка и в чём она заключалась.
© 2025 Oracle
Licensed under the GPLv2 License.