Russian Qt Forum

Программирование => Базы данных => Тема начата: Yegor от Март 13, 2018, 20:20



Название: [РЕШЕНО] Извлечение FLOAT значений из базы данных - ошибка
Отправлено: Yegor от Март 13, 2018, 20:20
Всем здравствуйте!

Использую mysql 5.7.21
OC - Linux Ubuntu 16.04.1
Qt 5.7.1

Есть таблица, в которой поле с типом float.

Извлекаю c помощью QSqlQuery значения из полей.
Код
C++ (Qt)
QSqlQuery query( QSqlDatabase::database("MyConName") );
query.exec(" SELECT myCol1, myCol2 FROM MyTable ");
bool ok=false;
while ( query.next() )
{
   const float myValue1 = query.record().value("myCol2").toFloat(&ok)
   if ( !ok )
       throw new Except("cannot extract 'myCol2'");
}

И при извлечения этого значения float (myCol2) бывает происходит ошибка ( ok == false). Причем она когда есть, а когда нет. Для тех же данных в той же таблице (таблица и ее данные не меняются). Например если запустить отладку программы, то все нормально. А если просто запустить (без отладки) ту же самую программу (тот же исполняемый файл), то работает с ошибками.
Нормально преобразовывает числа (операция toFloat(&ok)), у которых дробная часть - все нули, например, 112.000. И не может преобразовать, если дробная часть не нули, например, 112.23

Что это вообще может быть, где копать?

Спасибо!


Название: Re: Извлечение FLOAT значений из базы данных - ошибка
Отправлено: kai666_73 от Март 14, 2018, 11:25
Очень похоже что это связяно с настройками локали (системы, программы, БД).
То бишь с символом-разделителем дробной части. То есть toFloat ожидает что разделителем будет точка, а из БД приходит запятая, или наоборот.
Выведите строковое представление значения в консоль перед преоброзованием...


Название: Re: Извлечение FLOAT значений из базы данных - ошибка
Отправлено: Yegor от Март 14, 2018, 13:16
Цитировать
Выведите строковое представление значения в консоль перед преобразованием...

Вывел на консоль, вывод правильный. То есть, действительно, не настроена локаль.
А подскажите, пожалуйста, как локаль настраивать, для правильной интерпретации float (метод toFloat).

Как это делать в Qt? И есть ли настройка локали в MySQL?


Название: Re: Извлечение FLOAT значений из базы данных - ошибка
Отправлено: kai666_73 от Март 14, 2018, 17:34
Насчет MySQL не скажу. А в Qt установить локаль для разделителя дробной части ака точка можно, например так:
Код
C++ (Qt)
QLocale::setDefault(QLocale::C);
 


Название: Re: Извлечение FLOAT значений из базы данных - ошибка
Отправлено: Yegor от Март 14, 2018, 20:24
Понятно. Спасибо большое за ответ!