2016-07-15 1 views
1

Если я выполняю запрос к библиотеке MySQL Connector/C, то данные, которые я возвращаю, отображаются в прямом формате char *, включая числовые типы данных.Являются ли данные, возвращаемые из запроса MySQL Connector/C не в формате родных данных C?

Например, если я выполняю запрос, который возвращает 4 столбца, все из которых равны INTEGER в MySQL, вместо того, чтобы возвращать 4 байта данных (каждый байт представляет одно значение строки столбца), я фактически получаю назад 4 ASCII закодированные байты символов, где 1 фактически является байтом с числовым значением 49 в нем (ASCII для 1).

Является ли это точной или я просто пропустил что-то в комплекте?

Нужно ли мне тогда atoi, что возвращаемый байт в int в моем коде или есть механизм для получения собственных типов данных C из клиента MySQL напрямую?

Я предполагаю, что мой настоящий вопрос: является ли структура mysql_store_result преобразованием этих данных в кодированные представления ASCII способом, который может быть обойден кодом моего приложения?

+0

mysql ints 32bit. для 4-х целых чисел вы должны вернуть 16 байт данных. –

+0

Некоторые инструменты, которые вы используете, заставляют вас пропустить понимание результатов. Как именно вы «вернулись» – Hogan

+0

Я определенно не знаю. Число '' '1000000' возвращается как 8-байтовая строка (ASCII = 49,48,48,48,48,48,48,0) - 7 байтов для чисел, а затем нулевой байт. – SimplePanda

ответ

1

Я считаю, что данные отправляются на провод в виде текста в протоколе MySQL (я только что подтвердил это с помощью Wireshark). Таким образом, это означает, что mysql_store_result() не преобразует данные, а просто передает данные по мере их получения. MySQL фактически отправляет целые числа в виде текста. Я согласен, что это всегда казалось странным дизайном для меня.

+0

Да, непонятно. Мне потребовался час, чтобы понять, что «49» не было ошибкой, и мне нужно было atoi(), чтобы байт вернулся к int = 1. Похоже, что если вы используете подготовленные инструкции, то MySQL переключается на двоичный протокол для кодирования данных, но это не очень полезно, если ваш код Connector/C принимает произвольный SQL из более позднего стека. – SimplePanda

1

Первоначально MySQL предлагал только Text Protocol, в котором (как вы заметили) результаты кодируются как строки. MySQL v4.1 (выпущен в апреле 2003 года) представил протокол Prepared Statement, который (среди прочего) передает результаты в двоичном формате.

См. C API Prepared Statements для получения дополнительной информации о том, как использовать последний протокол с разъемом/C.

Смежные вопросы