Почему PreparedStatement.setNull требует sqlType?
-
В соответствии с java-документами PreparedStatement.setNull: "Примечание: вы должны указать параметр SQL type". В чем причина того, что для этого метода требуется тип SQL столбца?
-
Я заметил, что передача java.sql.Types.VARCHAR также работает для столбцов без varchar. Существуют ли сценарии, в которых VARCHAR не подходит (некоторые типы столбцов или определенные поставщики баз данных)?
Спасибо.
Ответы
Ответ 1
Согласно java-документам PreparedStatement.setNull: "Примечание: вы должен указать параметр SQL типа". В чем причина того, что метод требует типа SQL столбец?
Для максимальной совместимости; в соответствии со спецификацией существуют некоторые базы данных, которые не допускают отправку нетипизированного NULL в исходный источник данных.
Я заметил, что java.sql.Types.VARCHAR также работает для столбцы non-varchar. Здесь сценарии, в которых VARCHAR не будет подходящие (определенные типы столбцов или некоторые поставщики БД)?
Я не думаю, что такое поведение действительно является частью спецификации или если оно есть, то я уверен, что там происходит какое-то неявное принуждение. В любом случае, полагаться на такое поведение, которое может нарушиться, когда базовые изменения хранилища данных не рекомендуются. Почему бы просто не указать правильный тип?
Ответ 2
Драйверы JDBC, похоже, отходят от setNull
. См. Добавить поддержку для setObject (<arg> , null).
Мой список баз данных, поддерживающий более логичное поведение:
- Oracle
- MySQL
- Sybase
- MS SQL Server
- HSQL
Мой список баз данных НЕ поддерживает это логическое поведение:
Ответ 3
Когда дело доходит до Oracle, было бы очень неразумно использовать varchar2 по отношению к другим типам данных. Это может обмануть оптимизатора, и вы можете получить плохой план выполнения. Например, фильтрация в столбце даты с использованием типа данных timestamp в вашей привязке, Oracle может завершить чтение всех ваших строк, преобразующих все даты в метку времени, а затем отфильтровывая нужные строки.
Если у вас есть указатель на столбце даты, это может даже ухудшиться (если оракул решил использовать его) - делать одиночные чтения на ваших блоках оракула.
- Лассе