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);
    

Anmelden zum Antworten