2010-02-02 6 views
5

Il modo classico per interrogare un database SQL caso insensibile da Java è la seguente:Come ordinare i risultati senza distinzione tra maiuscole e minuscole in Oracle SQL?

String name = ...; // get the user's input (case is unknown) 
String sql = "select * from Person where lower(name) = ?"; 
Object jdbcBindVariable = name.toLowerCase(); 
// ... using JDBC, bind that variable and run the SQL query 

Il problema è che inferiore dell'involucro è un'operazione specifica locale. Ad esempio, nella parte inferiore della lettera "I" si ottengono risultati diversi in inglese e turco. Nel codice di cui sopra, ci sono due operazioni inferiore involucro: metodo

  • The String # toLowerCase()
  • Più basso() funzione di database

Come posso fare in modo che Java e la il database utilizza le stesse impostazioni internazionali e quindi esegue un confronto valido?

Sono consapevole che la classe String ha un metodo toLowerCase (Locale), ma come faccio a sapere quale lingua locale sta utilizzando il database? Posso verificarlo a livello di codice o devo codificare a caldo il locale con quello con cui penso sia configurato il database (in questo caso Oracle 10g)?

risposta

2

La risposta semplice è lasciare che sia il database a farlo. In questo modo il modo in cui la variabile di binding viene inserita in lettere minuscole sarà coerente con il modo in cui il valore della colonna viene messo in minuscolo.

String sql = "select * from Person where lower(name) = lower(?)"; 
+0

E ' così semplice eppure non ci ho mai pensato. –

1

... ma come faccio a sapere cosa Locale il database utilizza? Posso controllare questo a livello di programmazione ...

Non sembra essere un metodo portatile (indipendente dal database) per eseguire questa operazione, ma è possibile apparentemente utilizzare la seguente query per ottenere il set di caratteri utilizzato da un database Orable:

select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET'; 

This page fornisce ulteriori dettagli.

Per quanto riguarda il confronto, sarebbe meglio (*) lasciare che il database si occupi della parte inferiore, come suggerisce @Gary. Il driver JDBC si prenderà cura della conversione di stringhe Java (UTF-16) in qualunque sia il database utilizzato.

(* In realtà, non credo di avere molta scelta, a meno che non siete disposti a portare il costo di memorizzazione maiuscole e minuscole e minuscole copie di tutte le stringhe interrogabile nel database.)

+1

"Database orable" - slittamento freudiano? :-) –

+0

Oh caro! Come è entrato? :-) –

Problemi correlati