6.2.2 Преобразования типов в подготовленных запросах C API
Подготовленные запросы передают данные между клиентом и сервером, используя переменные языка C на стороне клиента, которые соответствуют значениям SQL на стороне сервера. Если существует несоответствие между типом переменной C на стороне клиента и соответствующим типом значения SQL на стороне сервера, MySQL выполняет неявные преобразования типов в обоих направлениях.
MySQL знает код типа для значения SQL на стороне сервера. Значение buffer_type в структуре MYSQL_BIND указывает код типа переменной C, которая хранит значение на стороне клиента. Эти два кода вместе сообщают MySQL о том, какие преобразования необходимо выполнить, если таковые имеются. Вот несколько примеров:
Если вы используете
MYSQL_TYPE_LONGс переменнойintдля передачи целочисленного значения на сервер, которое должно быть сохранено в столбец, MySQL преобразует значение в формат с плавающей точкой перед сохранением.Если вы извлекаете значение столбца SQL, но указываете значение
buffer_typeкакMYSQL_TYPE_LONGLONGи используете переменную C типаlong long intв качестве буфера назначения, MySQL преобразует значение (которое требует меньше 8 байт) для хранения вlong long int(переменную размером 8 байт).Если вы извлекаете числовой столбец со значением 255 в символьный массив
char[4]и указываете значениеbuffer_typeкакMYSQL_TYPE_STRING, результирующее значение в массиве — это строка размером 4 байта'255\0'.MySQL возвращает значения в виде строкового представления исходного значения на стороне сервера, поэтому соответствующий тип C — это
char[]. Например, значение12.345возвращается клиенту как'12.345'. Если вы указываетеMYSQL_TYPE_NEWDECIMALи привязываете строковый буфер к структуреMYSQL_BIND,mysql_stmt_fetch()сохраняет значение в буфере как строку без преобразования. Если вместо этого вы указываете числовую переменную и код типа,mysql_stmt_fetch()преобразует строковое значение в числовой формат.-
Для кода типа
MYSQL_TYPE_BITзначения возвращаются в строковый буфер, поэтому соответствующий тип C —char[]. Значение представляет собой битовую строку, требующую интерпретации на стороне клиента. Чтобы вернуть значение в более удобном формате, вы можете привести значение к целочисленному типу с помощью одного из следующих выражений:SELECT bit_col + 0 FROM t SELECT CAST(bit_col AS UNSIGNED) FROM t
Для получения значения привяжите целочисленную переменную, достаточную для хранения значения, и укажите соответствующий целочисленный код типа.
Перед привязкой переменных к структурам MYSQL_BIND, которые будут использоваться для извлечения значений столбцов, вы можете проверить коды типов для каждого столбца набора результатов. Это может быть желательно, если вы хотите определить, какие типы переменных лучше использовать, чтобы избежать преобразований типов. Чтобы получить коды типов, вызовите mysql_stmt_result_metadata() после выполнения запроса с помощью mysql_stmt_execute(). Данные метаинформации предоставляют доступ к кодам типов для набора результатов, как описано в разделе 6.4.23, «mysql_stmt_result_metadata()», и разделе 5.2, «Основные структуры данных C API».
Чтобы определить, содержат ли значения выходных строк в наборе результатов, возвращенных сервером, двоичные или недвоичные данные, проверьте, равно ли значение charsetnr метаданных набора результатов 63 (см. раздел 5.2, «Основные структуры данных C API»). Если это так, кодировка символов — binary, что указывает на двоичные, а не на недвоичные данные. Это позволяет отличить типы от типов и типы от типов .
Если вы устанавливаете значение члена max_length структур метаданных столбца MYSQL_FIELD (вызвав mysql_stmt_attr_set()), имейте в виду, что значения max_length для набора результатов указывают на длины самого длинного строкового представления результатов, а не длины двоичного представления. То есть, max_length не обязательно соответствует размеру буферов, необходимых для извлечения значений с использованием двоичного протокола, используемого для подготовленных запросов. Выберите размер буферов в соответствии с типами переменных, в которые вы извлекаете значения. Например, столбец TINYINT, содержащий значение -128, может иметь значение max_length равное 4. Но двоичное представление любого значения TINYINT требует только 1 байта для хранения, поэтому вы можете предоставить переменную signed char, в которой хранится значение, и установить is_unsigned, чтобы указать, что значения имеют знак.
Изменения метаданных таблиц или представлений, на которые ссылаются подготовленные запросы, распознаются и вызывают автоматическую повторную подготовку запроса при его следующем выполнении. Для получения дополнительной информации см. .
© 2025 Oracle
Licensed under the GPLv2 License.