У меня есть сложная проблема с обработкой драйвером JDBC Oracle CHAR
типов данных. Возьмем простую таблицу:
create table x (c char(4));
insert into x (c) values ('a'); -- inserts 'a '
Поэтому, когда я что-то вставляю в CHAR(4)
, строка всегда заполняется пробелами. Это также делается, когда я выполняю такие запросы:
select * from x where c = 'a'; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
Здесь константа 'a'
также заполнена пробелами. Вот почему запись всегда возвращается. Это верно, когда эти запросы также выполняются с использованием JDBC PreparedStatement
. Теперь самое сложное, когда я хочу использовать переменную связывания:
PreparedStatement stmt =
conn.prepareStatement("select * from x where c = ?");
stmt.setString(1, "a"); // This won't return any records
stmt.setString(1, "a "); // This will return a record
stmt.executeQuery();
Это обходной путь:
PreparedStatement stmt =
conn.prepareStatement("select * from x where trim(c) = trim(?)");
stmt.setString(1, "a"); // This will return a record
stmt.setString(1, "a "); // This will return a record
stmt.executeQuery();
EDIT: Теперь это ограничения:
- Приведенный выше обходной путь нежелателен, так как он изменяет содержимое как
c
, так и?
, И делает использование индексов дляc
довольно сложным. - Перемещение столбца с
CHAR
наVARCHAR
(как и должно быть, конечно) невозможно
EDIT: причины этих ограничений в том, что я задаю этот вопрос с точки зрения разработчика jOOQ, библиотека абстракции базы данных. Итак, мои требования состоят в том, чтобы предоставить очень универсальное решение, которое ничего не ломает в клиентском коде jOOQ. Вот почему я не большой поклонник обходного пути. И именно поэтому у меня нет доступа к объявлению этого столбца CHAR
. Но все же, я хочу быть в состоянии справиться с этим делом.
Что бы вы сделали вместо этого? Что является хорошей практикой для обработки типов данных CHAR
, когда я хочу игнорировать завершающие пробелы?