Название: [РЕШЕНО] Извлечение float из таблицы Отправлено: Yegor от Май 18, 2018, 17:24 Всем здравствуйте!
Работаю с OC Linux Ubuntu, Qt 5.7.1, MySQL v 5.7.22 Извлекаю запросом (QSqlQuery) данные (float) таблицы и конвертирую результат ( QSqlQuery.record().value("MyVal).toFloat() ) Если чило число в базе не имеет значения после запятой ( например, 12.0 ), то результат извлекается. А если число в базе со значением после запятой ( например, 12.2 ), то результат не извлекается (QVariant::invalid). Подскажите, пожалуйста, что нужно знать еще по поводу извлечения float чисел из базы. Локаль? Что нибудь еще? Спасибо! Название: Re: Извлечение float из таблицы Отправлено: Old от Май 18, 2018, 17:29 Локаль.Из базы может возвращаться значение с разделителем запятая, а в локале прописана точка. Или наоборот.
Название: Re: Извлечение float из таблицы Отправлено: Yegor от Май 18, 2018, 17:52 А как локаль настраивать? Ведь настройки локали есть и для OC и для приложения и для MySQL.
Название: Re: Извлечение float из таблицы Отправлено: Old от Май 18, 2018, 18:31 А как локаль настраивать? Ведь настройки локали есть и для OC и для приложения и для MySQL. Класс QLocale умеет необходимые преобразования.Название: Re: Извлечение float из таблицы Отправлено: Yegor от Май 18, 2018, 21:26 Использую локаль. Хоть с точкой, хоть без. Одинаково дробные числа (со значениями после точки) не извлекаются.
Создаю простую базу для проверки. Код
Далее минимально компилируемый проект для проверки. Код
И вывод приложения: Код: General decimal point: '.' То есть видно, что число без дробной части извлеклось, а числа с дробными значениями - нет. Все ли я правильно сделал? Может еще что не учел? Может указывать дополнительные опции при соединении - QSqlDatabase::setConnectOptions(const QString &options = QString()) ? (Там я не нашел что либо касательно форматов чисел). Название: Re: Извлечение float из таблицы Отправлено: Old от Май 18, 2018, 21:42 А что будет если попробовать установить локаль с разделителем "," и если не устанавливать локаль вообще?
И попробуйте получать значения без формирования QSqlRecord, т.е. так query.value( 0 ) Название: Re: Извлечение float из таблицы Отправлено: Yegor от Май 19, 2018, 12:29 Делаю вывод типа qInfo() << query.value(0)
1) Делаю локаль с разделителем , (раскоментирую в исходниках первый блок, комментирую второй). Выводит: Код: Decimal point: ',' 2) Делаю локаль с разделителем . (раскоментирую в исходниках второй блок, комментирую первый). Выводит: Код: Decimal point: '.' 3) Вообще не устанавливаю локаль (коментирую 2 блока) Вывод: Код: Decimal point: '.' То есть не зависит от разделителя. Далее я экспериментировал со структурой таблицы в mysql. Сделал тип столбца не float, a float (6,2). Код: +----------+------------------+------+-----+---------+----------------+ И вывод программы в таком случае (с разными комбинациями локалей) одинаковый - Код: Result: То есть вообще числа не распознаются. Далее я экспериментировал, изменил структуру таблицы, вместо float сделал varchar(10). Код: +----------+------------------+------+-----+---------+----------------+ В таком случае все считывается нормально. Не зависимо от локали. Если выводить с помощью qInfo() << record(0), то вывод: Result: Код: QVariant(QString, "1.00") А если через QRecord и конвертировать (во float) qInfo() << query.record().value(0).toFloat() Result: Код: 1 Как вы думаете, почему не работает вывод, если тип столбце таблицы - float (да и double тоже)? И хороршая ли практика, если столбец вместо float делать varchar? Название: Re: Извлечение float из таблицы Отправлено: Yegor от Май 21, 2018, 11:55 Проверил этот же пример и эту же базу данных на других операционных системах (Windows7, FreeBSD). И все работает нормально (правильно извлекает float), не зависимо от локали. Значит, проблема не в программе, а в ОС Ubuntu или Qt. А в чем именно, не определил. Но не в программе. Проблема решена.
|