Spec-Zone.ru › MySQL Connectors 1.0

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.24, «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.
https://docs.oracle.com/cd/E17952_01/c-api-8.4-en/c-api-prepared-statement-type-conversions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API