Oracle JDBC и тип данных Oracle CHAR

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

14
задан Lukas Eder 5 March 2018 в 19:29
поделиться