Friday, April 13, 2012

Problem mit nicht Casesensitiver Suche in SQL

Bei vielen alphanumerischen Suchen in meinen Javaprogrammen habe ich bisher folgendes Pattern verwendet:

Ein PreparedStatement mit folgenden SQL erstellt "select *from table where ucase(name)=?"

Sting caseInsentiveSuchbegriff=suchbegriff.toUpperCase();
ps.setString(caseInsentiveSuchbegriff)
ResultSet rs=ps.executeQuery();

Das hat bisher auch sehr gut funktioniert, bis mir gestern ein Benutzer gesagt hat, dass er keine Suchbegriff mit einem "ß" findet. Nach kurzer Debugsitzung war auch klar warum. Java verwendet für Strings Unicode in dem kein großes "ß" definiert ist und verwandelt daher ein "ß" in ein "SS". Unserer Datenbank db/2 auf OS/400 gibt bei ucase('ß') aber ein "ß" zurück. Daher findet das Query keinen Satz.

Die einfachste Lösung für das Problem ist die upperCase auf lowerCase umzubauen und dann funktionieren auch Suchen nach "ß" einwandfrei.

P.S.

Interessant ist in diesem Zusammenhang, dass folgender Code false ergibt.

"groß".equals("groß".toUpperCase().toLowerCase());

Was ganz logisch ist, da "groß" nach dem toUpperCase() zu "GROSS" wird und bei dem toLowerCase() dann zu "gross" konvertiert wird.
 


No comments:

Post a Comment

ad