Oracle und UTF8
-
Hallo zusammen,
ich habe folgendes Problem:
ich kodieren ein polnisches Zeichen (> ASCII 127) in UTF8. Es wird also in 2 byte konvertiert. Danach schreiben ich das Zeichen in eine Oracle Datenbank.
Wenn ich das Zeichen nun wieder auslesen möchte, stelle ich fest, dass das zweite Byte des Zeichen nicht mehr dem entspricht, welches ich geschrieben habe.
Woran liegt das? Wird in der DB nochmal kodiert?
Vielen Dank!
-
Habe nun herrausgefunden, dass es sich bei dem Wert 133 um ein Control (NEL = NEXT LINE) handelt.
Kann es sein, dass Oracle da Probleme mit hat?
-
Es hängt vom Datentyp ab, ob die Datenbank noch rumkonvertiert. Wenn du auf byte-Ebene arbeitest, verwendest du also binary objects als Datenbank-Typ?
-
Folgende Einstellungen hat die DB:
PARAMETER VALUE ------------------------------ ---------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET WE8ISO8859P1 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM PARAMETER VALUE ------------------------------ ---------------------------------------- NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 10.2.0.1.0
Einstellungen der Tabelle:
Name Null? Typ ----------------------------------------- -------- ---------------------------- TEXT VARCHAR2(400)
-
Mit Sicherheit kann ich es dir nicht sagen, aber ich denke schon, dass die Datenbank die Zeichen dann in der eingestellten Kodierung ablegt. Ich verstehe auch nicht so ganz, wie du auf das ganze Byte-Gefrickel kommst. Jedes vernünftige Datenbank-API liefert dir einen String, wenn es sich um varchar handelt.
Was machst du denn genau und was benutzt du dafür?
-
Optimizer schrieb:
Was machst du denn genau und was benutzt du dafür?
So schreibe ich das Ganze in die DB ...
SQL << L"INSERT INTO TABLE VALUES('" << wstr << L"')"; m_DBOracle.ExecuteSQL(SQL.str().c_str());
... und so lese ich es wieder aus:
RSTest.Open(CRecordset::forwardOnly, L"SELECT * FROM TABLE"); RSTest.GetFieldValue(L"TEXT", cswTxt);