Java: ResultSet getString() отличается между средами
У меня есть запрос SQL, который возвращает объект Date оракула. например:
ВЫБЕРИТЕ sysdate ОТ ДВОЙНОГО
В настоящее время существует код, который делает следующее:
String s = rs.getString ("sysdate");
Проблема в том, что это возвращает разный формат даты в разных средах (база данных одинакова).
Вернется одна среда:2011-01-31 12:59:59.0
Другой вернет что-то более странное: 2011-1-31 12.15.32.0
(время разделяется десятичными знаками)
Может быть, это как-то связано с локалью... одна машина "английский (Канада)", как сообщает java, другая - "английский (США)".
Что меня интересует, так это, когда результирующий набор преобразует объект даты в строку, откуда этот формат?
5 ответов
С сайта Oracle:
Во время подключения к базе данных библиотека классов JDBC устанавливает параметры сервера NLS_LANGUAGE и NLS_TERRITORY в соответствии с локалью виртуальной машины Java, на которой работает драйвер JDBC
Так что да, разница в ответе заключается в том, что на компьютерах указан другой языковой стандарт. Правильное решение должно состоять в том, чтобы использовать getDate() или getTimestamp() или заставить сервер базы данных возвращать дату в виде строки в определенном формате, как упоминалось ранее.
Я предлагаю не звонить getString
совсем. Запрошенное вами значение не является строкой, это дата или отметка времени. Так что звоните getDate
или же getTimestamp
вместо. (Я не знаю, какой из них является наиболее подходящим, это зависит от точной семантики sysdate
.)
Если вам необходимо отформатировать его, вы можете сделать это соответствующим образом.
По сути, чем меньше текстовых преобразований между вашим кодом и базой данных, тем лучше. Это одна из причин использования параметризованных запросов - вам не нужно заботиться о том, как база данных будет анализировать числовые значения или даты и время; Вы просто предоставляете значение. Это то же самое, но наоборот.
В драйверах 11g формат кажется жестко закодированным. призвание getString()
на наборе результатов в конечном итоге вызывает это:
oracle.sql.TIMESTAMPTZ.toString(int year, int month, int day, int hours, int minutes, int seconds, int nanos, String regionName)
Для свиданий, oracle.jdbc.driver.DateAccessor.getString()
вызывает это с nanos=-1, и результат использует формат "гггг-мм-дд чч: мм: сс"
Для меток времени используется формат "гггг-мм-дд ЧЧ: ММ: СС.С". Будет включено до 9 цифр наносекунд.
На самом деле еще один интересный результат заключается в том, что это значительно изменилось с 10 г до 11 г:
10.2.0.5.0:
select a DATE value and use getString to read it
2009-04-20 00:00:00.0
select a TIMESTAMP value and use getString to read it
2010-10-15.10.16. 16. 709928000
11.2.0.2.0:
select a DATE value and use getString to read it
2009-04-20 00:00:00
select a TIMESTAMP value and use getString to read it
2010-10-15 10:16:16.709928
Могут ли в вашей среде использоваться разные версии драйверов Oracle JDBC?
Если вы действительно хотите использовать его в качестве строки, лучше использовать to_char в запросе.
SELECT to_char(sysdate, 'MM/DD/YYYY') FROM DUAL;
Это будет соответствовать.
Не использовать getString
использовать getDate
(или же getTimestamp
). Таким образом, он не будет полагаться на ядро базы данных, чтобы преобразовать его в строку.