Тип данных результата SUM в MySQL

У меня возникла небольшая проблема с преобразованием результата запроса MySQL в класс Java при использовании SUM.

При выполнении простого SUM в MySQL

SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate';

поскольку price является целым числом, кажется, что SUM иногда возвращает строку, а иногда целое число, в зависимости от версии драйвера JDBC.

Очевидно, сервер сообщает драйверу JDBC, что результатом SUM является строка, и драйвер JDBC иногда "удобно" преобразует ее в целое число. (см. объяснение Марка Мэтьюза).

Код Java использует некоторую BeanInfo. и Introspector для автоматического заполнения (список) bean-компонентов с результатом запроса. Но это, очевидно, не может работать, если типы данных различаются между серверами, на которых развернуто приложение.

Мне все равно, получу ли я строку или целое число, но я хотел бы всегда иметь один и тот же тип данных или, по крайней мере, заранее знать, какой тип данных я получу.

Есть ли способ узнать, какой тип данных будет возвращен MySQL SUM из кода Java? Или кто-нибудь знает лучший способ справиться с этим?


person Pieter    schedule 27.11.2008    source источник


Ответы (3)


Это всего лишь предположение, но, возможно, приведение к целому числу заставит MySQL всегда говорить, что это целое число.

SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';
person Vinko Vrsalovic    schedule 27.11.2008
comment
что там с зефиром? - person andyk; 27.11.2008
comment
люблю пирожные с зефиром - person Vinko Vrsalovic; 27.11.2008
comment
Сосредоточившись на том, чтобы возиться с драйвером, я полностью упустил из виду очевидный обходной путь mysql :) Большое спасибо. - person Pieter; 05.12.2008
comment
Хорошо, этот ответ и комментарии только начали гулять по Интернету. Заметил это на случайном сайте с забавными картинками. - person Dykam; 18.01.2010
comment
@Dykam: Тогда этот сайт, вероятно, не очень смешной. - person Vinko Vrsalovic; 18.01.2010
comment
Уровень веселья действительно не очень высок, но это заставило меня улыбнуться. - person Dykam; 18.01.2010

Я никогда раньше не работал с MySQL, поэтому не могу сказать почему, но если вы скажете:

ResultSet rs = statement.executeQuery("SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate'");
int sum = 0;
if(rs.next())
size = Integer.parseInt(rs.getString(1));

Тогда у вас не должно возникнуть проблем независимо от возвращаемого типа данных, как сказано в документации:

Строка getString (int columnIndex) выдает SQLException


Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language

person gtRpr    schedule 27.11.2008
comment
С java 11 и соединителем mysql j 8 ResultSet#getString для суммы` BIGINTt возвращает строку с десятичной точкой, т.е. 0. поэтому не может быть проанализирован с помощью parseInt - person bdrx; 13.04.2021

Я обнаружил, что COALESCE(SUM(price),0) хорош тем, что всегда гарантирует, что поле возвращает 0, если результата нет.

См.: http://lists.mysql.com/mysql/177427.

person Treffynnon    schedule 28.10.2009