Oracle JDBC e tipo de dados Oracle CHAR
Eu tenho um problema complicado com o manuseio de @ JDBC do driver OracCHAR
tipos de dados. Vamos pegar esta tabela simples:
create table x (c char(4));
insert into x (c) values ('a'); -- inserts 'a '
Então, quando insiro algo emCHAR(4)
, a string é sempre preenchida com espaço em branco. Isso também é feito quando executo consultas como esta:
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
Aqui, a constante'a'
também é preenchido com espaço em branco. É por isso que o registro é sempre retornado. Isso vale quando essas consultas são executadas usando um JDBCPreparedStatement
também. Agora, o mais complicado é quando eu quero usar uma variável de ligação:
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();
Esta é uma solução alternativa:
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();
EDITA: Agora, estas são as restrições:
A solução alternativa acima não é desejável, pois modifica o conteúdo dec
e?
, E faz usando índices emc
Bem difícil Movendo a coluna deCHAR
paraVARCHAR
(como deveria ser, é claro) não é possívelEDITA: A razão para essas restrições é porque eu faço essa pergunta do ponto de vista do desenvolvedor do jOOQ, uma biblioteca de abstração de banco de dados. Portanto, meus requisitos são fornecer uma solução muito genérica que não quebre nada no código do cliente do jOOQ. É por isso que não sou realmente um grande fã da solução alternativa. E é por isso que não tenho acesso a esseCHAR
declaração da coluna. Ainda assim, eu quero poder lidar com este caso.
O que você faria em vez disso? O que é uma boa prática para lidar comCHAR
tipos de dados quando quero ignorar espaços em branco à direit