Bom… o post nem é tão velho, vou comentar porque me diverti com a minha bizarrice.
A minha é recente, foi semana passada. Vamos lah…
Eu tinha criado um relatório pelo iReport e tinha configurado o dataset com uma determinada SQL. Funcionou de boa mas depois que inclui um parametro ($p{variavel}) nessa SQL começou a dar pau… ao criar o preview o iReport vomitava um monte de stacktrace que eu não consegui identificar o erro na SQL, simplesmente dava SQLExecption e ponto final!.
Copiei a SQL que constava no stacktrace e rodei direto no pgAdmim e realmente não rodou, a explicação do erro não era claro. Eu examinava a SQL umas trocentas vezes e não via erro de sintaxe.
Como eu tinha essa mesma SQL em outro lugar, copiei as duas e coloquei num editor de texto, uma em cada linha e ia comparando caracter por caracter (na esperança de que fosse uma virgula no lugar de um ponto)… nada! As duas eram idênticas mas só uma funcionava! Passei um MD5 nas duas e o hash dava diferente… ai fiquei com raiva… criei um metodo em Java para comparar o número do char:
[code]public class ComparaString {
public static void main (String[] args){
String phraseOne = “SELECT l.id AS id_locacao, r.id AS id_receber, c.id AS id_cliente, l.data_fim, r.id AS id_receber, r.valor, r.pago_em, r.juros, r.id_extrato, r.pro_rata, r.pro_rata, c.nome || ’ ’ || c.sobrenome AS nome_completo_cliente FROM a_receber r INNER JOIN locacao l ON l.id = r.id_locacao INNER JOIN cliente c ON c.id = l.id_cliente WHERE TO_DATE((TRIM(TO_CHAR(DATE_PART(‘year’, l.data_fim), ‘9999’)) || ‘-’ || TRIM(TO_CHAR(DATE_PART(‘month’, l.data_fim), ‘99’)) || ‘-01’), ‘yyyy-mm-dd’) = TO_DATE(‘2013’||’-’||‘01’||’-01’, ‘yyyy-mm-dd’) AND DATE_PART(‘day’, l.data_fim) = 15”;
String phraseTwo = “SELECT l.id AS id_locacao, r.id AS id_receber, c.id AS id_cliente, l.data_fim, r.id AS id_receber, r.valor, r.pago_em, r.juros, r.id_extrato, r.pro_rata, r.pro_rata, c.nome || ’ ’ || c.sobrenome AS nome_completo_cliente FROM a_receber r INNER JOIN locacao l ON l.id = r.id_locacao INNER JOIN cliente c ON c.id = l.id_cliente WHERE TO_DATE((TRIM(TO_CHAR(DATE_PART(‘year’, l.data_fim), ‘9999’)) || ‘-’ || TRIM(TO_CHAR(DATE_PART(‘month’, l.data_fim), ‘99’)) || ‘-01’), ‘yyyy-mm-dd’) = TO_DATE(‘2013’||’-’||‘01’||’-01’, ‘yyyy-mm-dd’) AND DATE_PART(‘day’, l.data_fim) = 15”;
char[] phraseOneChars = phraseOne.toCharArray();
char[] phraseTwoChars = phraseTwo.toCharArray();
System.out.println("Tamanho da primeira string:"+phraseOneChars.length);
System.out.println("Tamanho da segunda string:"+phraseTwoChars.length);
System.out.println("Sao iguais?:"+phraseOne.equals(phraseTwo));
for (int i = 0; i<phraseOneChars.length; i++){
if (phraseOneChars[i] != phraseTwoChars[i]){
System.out.println("('"+phraseOneChars[i]+"'<>'"+phraseTwoChars[i]+"')");
System.out.println((int)phraseOneChars[i]);
System.out.println((int)phraseTwoChars[i]);
break;
}
else{
System.out.print(phraseOneChars[i]);
}
}
}
}
[/code]
Dessa forma eu constatei que havia um caracter no meio da SQL que não batia com a outra… visualmente as duas SQLs eram identicas mas na SQL que funcionava tinha um char[32] (space na tabela ASCII) e na SQL que dava erro tinha um char[160] (caracter não representável, ou seja, um espaço idêntico!).