Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2013, 11:10   #1
Mackey_
Новичок
Джуниор
 
Регистрация: 04.04.2013
Сообщений: 3
По умолчанию Как получить из MySQL данные типа int, double и др.

В базе MySQL числа хранятся в виде чисел, в программе числа используются в виде чисел.
Можно ли и забирать(вставлять) из базы числа в виде чисел?
Получается слишком много бессмысленных преобразований, создающих нагрузку на процессор:
1. Число в программе преобразовываем в строку для создания запроса (SELECT * Where a>10)
2. MySQL полученное число в виде строки опять преобразовывает в число.
3. Полученные результаты опять из числа преобразовывает в строку.
4. В программе, полученное число в виде строки опять преобразовываем в число для дальнейших операций.

Аналогично с добавлением и изменением данных в базе.

Если операций не много, на это можно не обращать внимание, а если их десятки тысяч в секунду, появляется ощутимая задержка.
Кто-нибудь знает, как эту процедуру можно ускорить?
Mackey_ вне форума Ответить с цитированием
Старый 04.04.2013, 11:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Чет ничего не понял. Если поле имеет тип int, оно и в прогу так же передается. Если цифровые данные храните в текстовых полях, то структура конечно обалденная.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.04.2013, 13:31   #3
Mackey_
Новичок
Джуниор
 
Регистрация: 04.04.2013
Сообщений: 3
По умолчанию

Вот распространенный пример кода запроса из базы.

Код:
mysql_query(conn, "SELECT * FROM `DB`.`table`");
result1 = mysql_store_result(conn);
int id;
while (rowr1 = mysql_fetch_row(result1))
{
	id=atoi(rowr1[0]);
}
функция atoi переводит из строки в число, при том, что само поле в базе типа int.

Последний раз редактировалось Stilet; 04.04.2013 в 13:41.
Mackey_ вне форума Ответить с цитированием
Старый 04.04.2013, 13:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А разве ПХП не получает кортеж? Разве нужно получаемые элементы конвертировать принудительно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2013, 14:09   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Stilet это ващето си
eval вне форума Ответить с цитированием
Старый 04.04.2013, 14:14   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Точно Си?
Тогда даже не знаю...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2013, 14:57   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

есть такая фигня, результат запроса возвращается как массив строк. ничего более умного чем хранить int как binary(4), double как binary(8) я не придумал.

да, если память мне изменяет, то при сохранении результата запроса в файл SELECT ... INTO OUTFILE результат не строковый, а бинарный. Т.е. можно оставить int, double как есть, дать FILE permission и развлекаться с файлами, что, на мой взгляд, слишком мрачно. Пользоваться binary и играться с указателями проще.

Последний раз редактировалось f.hump; 04.04.2013 в 15:31.
f.hump вне форума Ответить с цитированием
Старый 05.04.2013, 09:27   #8
Mackey_
Новичок
Джуниор
 
Регистрация: 04.04.2013
Сообщений: 3
По умолчанию

Спасибо!
По наводке нашел вот что (может кому будет полезно):
Create an MYSQL structure to manage the MySQL connection
Код:
========================================================== */
if ( (conn = mysql_init(NULL) ) == NULL )
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}

/* -----------------------------------------------
Establishes a connection to the database
----------------------------------------------- */
if (mysql_real_connect(conn,server,user,passwd,database,0,NULL,0) == NULL )
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

/* Allocate statement handler */
MYSQL_STMT *stmt;
stmt = mysql_stmt_init(conn);

if (stmt == NULL)
{
printf("Could not initialize statement handler\n");
exit(1);
}


// Prepare the statement
// Output format: string, string, double
const char *sql = "select fname, lname, salary from employee";

if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0)
{
printf("Could not prepare statement\n");
exit(1);
}


// Bind variables
// Output format: string, string, double

MYSQL_BIND result[3]; // 3 variables

char fn[100]; // fname
char ln[100]; // lname
double sal; // salary

memset (result, 0, sizeof (result)); /* zero the structures */

result[0].buffer = (void *) &fn; // first field in fn
result[0].buffer_type = MYSQL_TYPE_STRING; // Return data as string
result[0].buffer_length = 100;

result[1].buffer = (void *) &ln; // Second field in ln
result[1].buffer_type = MYSQL_TYPE_STRING; // Return data as string
result[1].buffer_length = 100;

result[2].buffer = (void *) &sal; // 3rd field in sal
result[2].buffer_type = MYSQL_TYPE_DOUBLE; // Return data as double

if (mysql_stmt_bind_result(stmt, result) != 0)
{
printf("Could not bind results");
exit(1);
}

// Execute!!
if (mysql_stmt_execute(stmt) != 0)
{
printf("Could not execute statement");
exit(1);
}

// Prepare to retrieve the result
if (mysql_stmt_store_result(stmt) != 0)
{
printf("Could not buffer result set");
exit(1);
}


/* ===========================================
Fetch one row at a time....
=========================================== */
double totalSal = 0;

while ( mysql_stmt_fetch (stmt) == 0 )
{
printf("%s %s: Salary = %lf\n", fn, ln, sal );
totalSal += sal;
}

printf("\nTotal Salary = %lf\n\n", totalSal );

/* ===========================================
Release memory space used by stmt
=========================================== */
mysql_stmt_free_result(stmt); /* deallocate result set */

/* ===========================================
Close SQL connection
=========================================== */
mysql_close(conn);
}

Последний раз редактировалось Stilet; 05.04.2013 в 10:28.
Mackey_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сделать из дробной части числа double число типа int Antej Общие вопросы C/C++ 15 14.12.2012 18:01
Как получить данные типа $4D, $5A... dolphin705 Общие вопросы Delphi 19 05.08.2010 19:35
in Формула типа String out результат типа Double Gypsy Общие вопросы Delphi 3 16.04.2010 10:21
Необходимо получить случайную величину типа Double, распределенную по функции Пуассона! SkAndrew Помощь студентам 3 04.01.2010 08:45
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17