У меня возникла сложная проблема с обработкой драйвером Oracle JDBC типов данных 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
, когда я хочу игнорировать конечные пробелы?