Очень странная проблема здесь.В Windows 2008r2 я создал таблицу MySQL 5.5, в которой столбец host_guid обозначен как bigint (20) без знака.Я храню ценность там.Я прочитал значение host_guid в приложение win32 c ++, используя библиотеку mysqlpp.Когда я считываю значение как беззнаковое __int64, оно равно 0. Если я читаю значение как строку, я получаю правильное значение, но когда я пытаюсь использовать что-то вроде istringstream для преобразования его в беззнаковое __int64, я получаюдругое число (как будто оно отсекает самый важный бит).Если я напишу пример программы с этим номером в виде строки и попытаюсь преобразовать его в 64-разрядное число без знака, оно будет работать нормально.Кроме того, если я дам дамп базы данных mysql, переместил ее в windows 7 и запустил тот же двоичный файл, который читает базу данных, он прекрасно работает.Вы думаете, что это вызывает повреждение памяти или различные версии библиотеки, которые вызывают это?Я в тупике.
Подведем итог:
Windows 2008r2 MySql 5.5.11 64-разрядное значение, которое пытается прочитать: 15216036968564760613 Использование mysqlpp для чтения в виде sql_bigint_unsigned Результат: 0
Это прекрасно работает на моей машине с Windows 7 с тем же двоичным файлом, теми же данными базы данных и теми же двоичными файлами mysql.Буду признателен за любые предложения или информацию, так как я работаю над этой «простой» ошибкой более суток.
- ОБНОВЛЕНИЕ - Вот пример, который работает на win7, но не работает (выбирает 0) на win2008r2:
#include <mysql++/mysql++.h>
#include <mysql++/ssqls.h>
sql_create_1(test_item,
1, 0,
mysqlpp::sql_bigint_unsigned, host_guid);
int _tmain()
{
mysqlpp::Connection conn(false);
conn.set_option(new mysqlpp::MultiStatementsOption(true));
if (conn.connect("db", "localhost", "r", "p"))
{
mysqlpp::Query query = conn.query();
query << "select 15216036968564760613 as host_guid";
query.parse();
std::vector<test_item> items;
query.storein(items);
for(int i = 0; i < items.size(); ++i)
{
std::cout << items.at(i).host_guid << std::endl;
}
}
return 0;
}