Водитель JDBC выполняет автоматическое приведение типов для Postgres - PullRequest
0 голосов
/ 18 мая 2018

Мой вопрос был основан на наблюдении, которое я сделал и не смог найти ответ.

В своем Java-коде я вставил значение типа «Double» в таблицу с помощью обычного Statement.setDouble (number) и извлек это же значение с помощью обычного resultSet.getDouble ();

Однако в указанной таблице этот конкретный столбец имеет тип «Текст»

Как получается, что значение вставляется и извлекается?Postgres / драйвер конвертирует его?Разве это не должно вызывать ошибку вместо этого из-за несоответствия типов данных?

Кроме того, если Postgres / драйвер выполняет автоматическое приведение, как это влияет на производительность?Использование Postgres 9.4

Так что это просто наблюдение, больше похожее на изучение из испытания.Я точно знаю, что это не то, что я написал бы как стандартный код.

1 Ответ

0 голосов
/ 18 мая 2018

Да, драйвер выполняет преобразования.В классе PGResultSet вы можете найти код, используемый для преобразования (он вызывается, если столбец является текстовым, для двоичных столбцов существуют другие преобразования).

public static double toDouble(String s) throws SQLException {
    if (s != null) {
      try {
        s = s.trim();
        return Double.parseDouble(s);
      } catch (NumberFormatException e) {
        throw new PSQLException(GT.tr("Bad value for type {0} : {1}", new Object[]{"double", s}),
            PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
      }
    }
    return 0; // SQL NULL
}

В спецификации указывается, что такие преобразования должны быть выполненытак что он работает в соответствии со спецификацией.Стоит ли полагаться на эти преобразования - это другой вопрос, как прокомментировал a_horse_with_no_name, почему означает , что вы храните парные числа как текст?

Производительность не имеет к этому никакого отношения.По сравнению с тем, что на самом деле делает драйвер (то есть чтение и запись данных), выполнение преобразований - это капля в море.

Преобразования по умолчанию, определяемые спецификацией JDBC, можно найти в приложении B.6 в конце.из http://download.oracle.com/otn-pub/jcp/jdbc-4_3-mrel3-eval-spec/jdbc4.3-fr-spec.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...