Oracle Problem mit Umlauten

Park

Mitglied
Hallo,

ich habe eine Frage zu dem leidigen Thema Umlaute. Auf einem Windows Server läuft eine OracleDB. Die möchte ich per Java auf einem Linuxsystem abfragen. Soweit klappt das. Leider sind die Umlaute kaputt. An die ServerMaschine komme ich administrativ nicht ran. Dort kann ich leider nichts ändern. Ich weiß aber, dass die Software XY auf dem Server, die Umlaute korrekt darstellt.

Ich hab mich schon durch das Netz gewühlt, aber so richtig erfolgreich war ich noch nicht. Vielleicht habt ihr ja einen Tipp, was noch fehlt oder wo man dran schrauben kann?

Der Connect zur DB geht klassisch mittels

Java:
...
query = "SELECT * FROM TABLE ....";
url = "jdbc:oracle:thin:@//"+host+":"+port+"/"+dbname;
Connection con = DriverManager.getConnection(url, dbuser, dbpass);
Statement stmt = con.createStatement();     
ResultSet rs = stmt.executeQuery(query);
...

Ich hab gelesen, dass man NLS_LANG auf dem Client setzen muss. Dazu habe ich ein Shell-Script geschrieben:
Code:
#!/bin/bash
NLS_LANG=german_germany.AL32UTF8
export NLS_LANG

Das wird vor dem Aufruf des Java Programms mittels
Code:
source ./set-my-env
aufgerufen. Ein Aufruf von
Code:
env
zeigt an, dass die VAR gesetzt ist.

Rufe ich mein Javaprogramm (in der selben Shell) auf und frage dort die DB ab, erscheinen keine Umlaute - bzw. kaputte. Frage ich per Javaprogramm die LANG-Parameter der DB ab mittels:
Java:
query = "select * from nls_database_parameters"

bekomme ich als Ausgabe

Code:
NLS_LANGUAGE - AMERICAN
NLS_TERRITORY - AMERICA
NLS_CURRENCY- $
NLS_ISO_CURRENCY - AMERICA
NLS_NUMERIC_CHARACTERS - .,
NLS_CHARACTERSET - WE8MSWIN1252
...

Irgendwas stimmt noch nicht. Aber was? Wie kann ich die LANG setzen? In der Shell oder in Java oder doch am Server? Hat jemand eine Idee?

Park
 

Bizarrus

Bekanntes Mitglied
Generell solltest du auch alles auf UTF-8 Umstellen, damit bei allen Seiten alle Chars korrekt gespeichert/angezeigt werden.
Kompiliere also deine Java-Applikation in UTF-8 - Ich weiß ja nicht ob du eine IDE nutzt, bei eclipse kannst du beispielsweise das Charset in den Projekteinstellungen abändern.

Beim Connect, habe ich etwas bei Stackoverflow gefunden gehabt:
PHP:
con = DriverManager.getConnection("jdbc:mysql:///dbname?useUnicode=true&characterEncoding=utf-8", "user", "pass")

Ob dies natürlich so funktioniert kann ich dir nicht sagen.

Die Datenbank selber solltest du natürlich auch in UTF-8 setzen:
Using SQL Loader with an UTF8 Characterset Database

P.S. Mache zuvor ein BACKUP/Dump der Datenbank, öffne die Textdatei und speicher die (beispielsweise über Notepad++) nochmal neu ab, aber im UTF8 ohne BOM - Dann ziehst du die Datenbank wieder rüber.

Probleme mit Sonderzeichen gibt es meist immer dann, wenn nicht alle "Dienste" den gleichen Charset verwenden. Du musst also beim nächstenmal darauf achten:
- Datenbank in UTF-8
- Java-Applikation in UTF-8
- MySQL-Connection in UTF-8
 

Park

Mitglied
Hi,

vielen Dank für die Antwort.

Ja, ich nutze eine IDE - Netbeans. Dort hab ich in den Einstellungen bereits UTF 8 stehen.

Die Erweiterung der DB-URL um
Code:
?useUnicode=true&characterEncoding=utf-8
scheint nicht für Oracle zu gelten. Zumindest hat es so bei mir nicht funktioniert.

Bei der DB selbst kann, darf und will ich nichts umstellen. Da muss ich das nehmen, was da ist. Aber so wie es aussieht, muß es ja irgendwie gehen. Denn wie sonst hätte die Hauptsoftware, für die die DB eigentlich ist, Umlaute?

Die große Frage ist, wie sage ich meiner Java-Klasse, dass sie beim Connect zu Oracle einen speziellen Charset nehmen soll?

Park
 

Bizarrus

Bekanntes Mitglied
Die Erweiterung der DB-URL um ?useUnicode=true&characterEncoding=utf-8 scheint nicht für Oracle zu gelten. Zumindest hat es so bei mir nicht funktioniert.
Kurios, denn ich habe extra darauf geachtet, dass dies für Oracle gillt.

Bei der DB selbst kann, darf und will ich nichts umstellen. Da muss ich das nehmen, was da ist. Aber so wie es aussieht, muß es ja irgendwie gehen. Denn wie sonst hätte die Hauptsoftware, für die die DB eigentlich ist, Umlaute?
1. Warum darfst du/willst du dies denn nicht?
2. Weil die Hauptsoftware (so vermute ich) auf das richtige Charset eingestellt ist(?)

Die große Frage ist, wie sage ich meiner Java-Klasse, dass sie beim Connect zu Oracle einen speziellen Charset nehmen soll?
Normalerweise, wie ich bereits schrieb, bei der Connection-URL.
Ansonsten probier doch einfach mal, das Charset von der Datenbank zu nutzen. Schau mal dort rein und guck mal, welche dort gesetzt ist - Und dann nimmst du halt das Charset für deine Applikation.
 

Park

Mitglied
Kurios, denn ich habe extra darauf geachtet, dass dies für Oracle gillt.
Vielleicht hab ich die Connect-URL ja auch falsch zusammen gebaut? Bei mir sieht sie so aus:

Java:
url = "jdbc:oracle:thin:@//"+host+":"+port+"/"+dbname+"?useUnicode=true&characterEncoding=utf-8";
Connection con = DriverManager.getConnection(url, dbuser, dbpass);

Das wirft beim Run dann die Fehlermeldung
Code:
java.sql.SQLException: NL Exception was generated


1. Warum darfst du/willst du dies denn nicht?
2. Weil die Hauptsoftware (so vermute ich) auf das richtige Charset eingestellt ist(?)
Das ist eine Fremd-Software. Wenn ich da was rumbiege und es kommt ein Update rein, dann kann das aufs neue Schwierigkeiten geben. Außerdem: wenn jemand an meiner Software rumbasteln würde, wäre ich leicht ungehalten - um es mal vorsichtig auszudrücken ;)

Park
 

Park

Mitglied
Nur am Rande für all diejenigen, die mal ein ähnliches Problem haben und mit PUTTY auf dem Server arbeiten und dort das Programm starten: auch in PUTTY muß man ggf. den richtigen Zeichensatz einstellen!

Ob man das tun muß, merkt man daran, wenn man mal auf der Console / im Editor Umlaute eingibt und nur "Müll" zu sehen ist. ;)

Damit sieht meine DB-Ausgabe noch nicht richtig aus, aber der Müll ist hübscher geworden ;) Statt eines wilden "Â"-Symbols hab ich jetzt ein schlichtes Quadrat ;)
 

Park

Mitglied
Also die DB ist auf ASCII (ISO-8859-1/15) eingestellt. Bei "normalen" Attributen sollte der JDBC das richtig konvertieren.
Problematisch sind CLOBs. Die mußt Du mittels [JAPI]InputStreamReader[/JAPI] unter Angabe des DB-Charsets in UTF-8 (das Charset der Java-Strings) umwandeln.

bye
TT

Was sind CLOBs? Und wie wandle ich mittels InputStreamReader einen String um? Ich hab irgendwie nur Beispiele zum Einlesen von Dateien, FTP u.ä. gefunden.

Irgendwie gehts ja grob so:

Java:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));

Nur statt System.in bräuchte ich jetzt so was wie

Java:
String mystring = ... //Hier den String aus der DB holen - Stichwort ResultSet
BufferedReader in = new BufferedReader(new InputStreamReader(mystring,"UTF-8"));

Aber das scheint mir zu simpel. Ich hab Tomaten auf den Augen und hab nicht gefunden, was InputStreamReader für einen DatenTyp als Parameter erwartet. Aber bestimmt keinen String ... ?!

Park
 

Timothy Truckle

Top Contributor
CLOB data type
Und wie wandle ich mittels InputStreamReader einen String um?
Using Large Objects (The Java™ Tutorials > JDBC(TM) Database Access > JDBC Basics)

Aber wenn Du nicht weist was ein Clob ist wird dass nicht Dein Problem sein.

Eigentlich kommt der JDBC-Treiber selbst gut mit der Convertierung der Zeichensätze für "normale" Varchar2-Attribute zurecht. Naue doch mal eine minimal konfigurierte Verbindung auf ohne irgendwelche einstellungen an der Session zu machen.

bye
TT
 
Zuletzt bearbeitet:

Park

Mitglied
Für alle anderen, die das gleiche oder ein ähnliches Problem haben, hier ein, zwei Erkenntnisse. Mein Google hat mir wichtige Infos irgendwie erst recht spät und nach massivem Rumstochern geliefert - oder ich hatte Tomaten auf den Augen. Wäre auch nicht auszuschließen ;)

Ohne Anspruch auf Vollständigkeit, 100%ige Richtigkeit und fachlich absolut korrekte Wiedergabe:

Grundprinzip wie Oracle wohl Zeichensätze, Sprache & Co regelt:
  • Auf dem OracleServer (in der DBSoftware!) ist ein Zeichensatz eingestellt
  • Auf dem Client (Betriebssystem!) ist ein Zeichensatz eingestellt
  • Der OracleClient (DBSoftware!) verwendet den Zeichensatz des Betriebssystems
  • Beim Datenaustausch zwischen OracleServer und OracleClient werden die Zeichensätze ggf. hin und her codiert
  • der OracleClient muss informiert werden wie das Betriebssystem die Zeichen codiert.

Ich hatte verschiedentlich zum Thema Oracle und Umlaute gelesen, dass man eine Umgebungsvariable NLS_LANG setzen muss. Bei Windows entweder als Regitry-Eintrag oder als Umgebungsvariable und bei Linux als Shell-Variable (wie siehe oben im Start-Thread).

Achtung: Das trifft nicht bei JAVA und JDBC zu!

Hier geht es anders. Wie, ist mir allerdings auch noch nicht ganz klar. Theoretisch soll der normale JDBC Treiber das von sich aus können. gerade UTF8 soll gehen. Mein Treiber weiß davon allerdings nichts :(

Weitere Hinweise und Tipps hab ich gefunden, die bei mir allerdings bisher nicht funktioniert haben:
  • wenn man das ResultSet ausliest, dann statt
    Code:
    rs.getString(index)
    lieber
    Code:
     new String(rs.getBytes(index),"UTF8" )
    verwenden
  • vor dem Verbindungsaufbau ein
    Code:
    Locale.setDefault(Locale.<your locale here>);
    ausführen
  • Aufruf der Java App von der Console mit den Parametern
    Code:
    -Duser.country=de -Duser.language=de

Bei mir hat es bisher allerdings nicht geholfen. Falls jemand noch einen Tipp hat, wäre das prima :)

Park
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O MySQL Problem mit Umlauten?! Datenbankprogrammierung 2
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
C Problem mit Apache Poi Datenbankprogrammierung 6
N HSQLDB Problem mit Eclipselink in runnable Jar Datenbankprogrammierung 10
P GroupLayout-Problem Datenbankprogrammierung 12
F XAMPP max connections problem Datenbankprogrammierung 6
C MySQL Problem in phpMyAdmin Oberfläche Datenbankprogrammierung 5
C Problem with INSERT.............ON DUPLICATE KEY Datenbankprogrammierung 3
C Problem with insertion in database. Datenbankprogrammierung 7
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
A kleines Problem Datenbankprogrammierung 6
T Problem mit Datenbankverbindung Datenbankprogrammierung 22
V Derby/JavaDB updateRow Problem Datenbankprogrammierung 0
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
Nuiton EmbeddedDriver Problem Datenbankprogrammierung 6
A MongoDB Passwort Problem Datenbankprogrammierung 0
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
F MySQL JDBC Problem Datenbankprogrammierung 5
Anfänger2011 Datenbankstruktur/aufbau (theoretisches Problem) Datenbankprogrammierung 5
M Derby/JavaDB Drop Database problem Datenbankprogrammierung 3
M Derby/JavaDB NOT LIKE problem Datenbankprogrammierung 19
N HSQLDB Problem mit EntityManager Datenbankprogrammierung 7
B MySQL JPAContainer Problem Datenbankprogrammierung 4
K Eclipse Apache Derby Treiber Problem Datenbankprogrammierung 4
C Problem oder Denkfehler mit H2-Database Datenbankprogrammierung 3
E Wie kann man das Problem mit der BLOB-Spalte lösen? Datenbankprogrammierung 1
M Problem mit jcouchdb und CouchDB - UTF8 kein gültiger Zeichentyp Datenbankprogrammierung 4
T MySQL Problem mit Datenbankanbindung Datenbankprogrammierung 4
M INSERT-Problem = integrity constraint violation: foreign key no parent Datenbankprogrammierung 5
P SQL Query Problem Datenbankprogrammierung 14
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
Q MySQL JDBC-Treiber Problem Datenbankprogrammierung 2
B SQLite Problem bei Planung der Datenbank [Jeopardy] Datenbankprogrammierung 3
A Problem mit dem Import und Export von Bildern Datenbankprogrammierung 4
A Problem mit Create-Statement Datenbankprogrammierung 9
D Problem mit COLUMN_IDENTIFIERS Datenbankprogrammierung 8
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
M Problem mit mehreren Datasourcen Datenbankprogrammierung 3
R Resultset.last() Problem Datenbankprogrammierung 12
M Problem GroupBy Datenbankprogrammierung 3
S CURRENT_DATE problem Datenbankprogrammierung 2
M Problem mt JPA Id-Generators Datenbankprogrammierung 18
Gossi Oracle Problem mit group by... Datenbankprogrammierung 22
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
R MS-SQL Express Login-Problem Datenbankprogrammierung 8
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
N HSQLDB Problem beim Treiberladen im Jar Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
M Problem mit HQL Syntax Datenbankprogrammierung 5
K Db4o Delete Problem Datenbankprogrammierung 11
Mike90 Deadlock/Lock Problem Datenbankprogrammierung 4
T Access 32bit on Win7 64Bit ODBC Problem Datenbankprogrammierung 1
C unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..) Datenbankprogrammierung 5
S ODBC Treiber Problem/oder unvermögen Datenbankprogrammierung 18
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
K Problem mit Datenbankverbindung via Eclipse Datenbankprogrammierung 2
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
B MySQL Problem mit Datenbankanbindung an MySQL Datenbankprogrammierung 2
N Problem bei Erstellung eines Index Datenbankprogrammierung 12
C Hibernate Property-Problem Datenbankprogrammierung 5
J MyBatis - Update Problem Datenbankprogrammierung 4
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
c_sidi90 Hibernate Problem Table doesnt excist Datenbankprogrammierung 8
M Problem mit JPA - OneToMany-Relation Datenbankprogrammierung 3
I Hibernate: Composite Foreign Key Problem Datenbankprogrammierung 14
S JPA OptimisticLocking Problem Datenbankprogrammierung 11
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
JavaKaffee Derby/JavaDB Quartz-WebAnwendung - Connection/Treiber Problem Datenbankprogrammierung 47
I Problem mit ResultSet Datenbankprogrammierung 2
L Excel in MySQL importieren Problem Datenbankprogrammierung 5
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
R MS Access mit Java Problem mit Update Statment Datenbankprogrammierung 13
S MySQL Problem mit SELECT bzw encoding Datenbankprogrammierung 4
T Problem beim schreiben von daten Datenbankprogrammierung 4
M MySQL getConnection - Verbindung Problem Datenbankprogrammierung 2
K Hibernate + MySQL Problem... Datenbankprogrammierung 2
I MySQL MySQL – Proxy Problem Datenbankprogrammierung 4
M Problem mit Hibernate und Named Query Datenbankprogrammierung 1
M Problem mit Hibernate und Access Datenbankprogrammierung 9
C firebird problem Datenbankprogrammierung 5
F Problem mit Datenbankabfrage Datenbankprogrammierung 7
K SQL Problem mit Date Datenbankprogrammierung 3
jeppi MySQL Design-Problem: DB-Verbindung herstellen und halten - JdbcRowSet / Idle-Timeout? Datenbankprogrammierung 9
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G MySQL Connection Problem Datenbankprogrammierung 3
E Hibernate Problem bei bidirektionaler 1:n Verbindung Datenbankprogrammierung 2
D MySQL Problem beim einfügen von Double-Zahlen Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
T Problem bei Zugriff auf Access Datenbank Datenbankprogrammierung 7
W jpmdbc Problem -Beispiel funktioniert nicht Datenbankprogrammierung 9
W Verständnis-Problem JPA Grundlagen Datenbankprogrammierung 5
M Problem Array in BLOB-Feld in DerbyDB zu speichern Datenbankprogrammierung 5
M JPA-Persist Problem Datenbankprogrammierung 2
7 Problem mit Hibernatekonfiguration Datenbankprogrammierung 13

Ähnliche Java Themen

Neue Themen


Oben