Frage

Hallo Ich versuche zu speichern Namen in einer Oracle-Datenbank und holen sie mit PHP und oci8 zurück.

Allerdings, wenn ich die é direkt in die Oracle-Datenbank einfügen und verwenden oci8 zu holen es zurück erhalte ich nur eine e

Muss ich alle Sonderzeichen codieren (einschließlich é) in HTML-Entities? (Dh: é), bevor sie in Datenbank einfügen ... oder bin ich etwas fehlt

Thx


UPDATE: 1. März um 18:40 Uhr

gefunden diese Funktion: http://www.php.net/manual/en/ function.utf8-decode.php # 85034

function charset_decode_utf_8($string) {
    if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
        return $string;
    }
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}

scheint zu funktionieren, wenn auch nicht sicher, ob seine die optimale Lösung


UPDATE: 8. März um 15:45 Uhr

Oracle-Zeichensatz ISO-8859-1.
in PHP ich hinzugefügt:

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");

die oci8 Verbindung zu erzwingen, dass der Zeichensatz zu verwenden. Abrufen des é von PHP oci8 jetzt gearbeitet! (Für varchars, aber nicht CLOBs zu tun hatte utf8_encode es zu extrahieren)
Also habe ich versucht, die Daten von PHP zu Oracle Speicher ... und es tut work..somewhere auf dem Weg von PHP zu Oracle die é eines ? werden


UPDATE: 9. März um 14:47 Uhr

So rückt immer näher. Nach dem Hinzufügen des NLS_LANG Variable tut direkte oci8 Einsätze mit é funktioniert.

Das Problem ist eigentlich auf der PHP-Seite. Durch die Verwendung von ExtJS Rahmen, wenn ein Formular abgeschickt werden sie es encodeURIComponent mit kodiert.
So é als %C3%A9 gesendet wird und dann neu codiert in é.
Allerdings Länge es ist jetzt 2 (strlen($my_sent_value) = 2) und nicht 1. Und wenn in PHP Ich versuche: $ my_sent_value == é = false

ich denke, wenn ich in der Lage bin neu codieren alle diese Zeichen in PHP zurück in Längen von Byte-Größe 1 und dann in Oracle eingeführt wird, sollte es funktionieren.

Noch kein Glück, obwohl


UPDATE: 10. März um 11:05 Uhr

Ich denke immer, ich so nah bin (doch so weit weg).

arbeitet putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9"); sehr sporadisch.

Ich habe einen kleinen PHP-Skript zu testen:

header('Content-Type: text/plain; charset=ISO-8859-1');
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$conn= oci_connect("user", "pass", "DB");
$stmt = oci_parse($conn, "UPDATE temp_tb SET string_field = '|é|'");
oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);

Nach dem Ausführen dieser ein Mal und loggin in die Oracle-Datenbank direkt sehe ich, dass STRING_FIELD auf |¿| gesetzt. Offensichtlich nicht, was ich gekommen war, aus meiner früheren Erfahrung erwarten.
Wenn ich jedoch, dass die PHP-Seite zweimal schnell auffrischen .... es funktionierte !!!
In Oracle Ich sah richtig |é|.

Es scheint, wie vielleicht die Umgebungsvariable wird nicht richtig eingestellt oder in der Zeit für die erste Ausführung des Skripts gesendet, aber für die zweite Ausführung zur Verfügung steht.

Mein nächstes Experiment ist die Variable in PHP-Umgebung zu exportieren, aber ich brauche Apache für das Zurücksetzen ... so werden wir sehen, was passiert, hoffentlich funktioniert es.

War es hilfreich?

Lösung 2

Das ist, was ich schließlich tat am Ende dieses Problem zu lösen:

Verändert das Profil des Daemon PHP laufen zu haben:

NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

Damit die oci8 Verbindung verwendet ISO-8859-1.

Da ist in meinem PHP-Konfiguration setzen Sie den Standard-Content-Typ ISO-8859-1:

default_charset = "iso-8859-1"

Wenn ich in eine Oracle-Tabelle am Einfügen über oci8 von PHP, das tue ich:

utf8_decode($my_sent_value)

Und wenn Daten von Oracle empfängt, sollte die variable Druck einfach funktionieren wie folgt:

echo $my_received_value

Allerdings, wenn die Daten über Ajax Senden Ich habe zu verwenden hatte:

utf8_encode($my_received_value)

Andere Tipps

Ich nehme an, Sie sind sich dieser Tatsachen bewusst:

  • Es gibt viele verschiedene Zeichensätze: Sie haben eine auswählen und, natürlich, wissen, was man Sie mit
  • .
  • Oracle ist durchaus in der Lage Text zu speichern, ohne HTML-Entitäten (é). HTML-Entities sind in, na ja, HTML verwendet. Oracle ist kein Web-Browser; -)

Sie müssen auch wissen, dass die HTML-Entities sind nicht auf eine bestimmte charset binden; im Gegenteil, sie ist verwendet, um Zeichen in einem charset unabhängigen Kontext darzustellen.

Sie sprechen unterschiedslos über ISO-8859-1 und UTF-8. Was charset tun Sie verwenden möchten? ISO-8859-1 ist einfach zu bedienen, aber es kann nur speichern Text in einigen lateinischen Sprachen (wie Spanisch) und es fehlen einige gemeinsame Zeichen wie das € -Symbol. UTF-8 ist schwieriger zu bedienen, aber es kann alle Zeichen vom Unicode-Konsortium definiert speichern (die alles umfassen Sie jemals brauchen werden).

Sobald Sie die Entscheidung getroffen haben, müssen Sie Oracle konfigurieren zu halten Daten in solchen charset und wählen Sie eine entsprechende Spalte Typ. Z. B. VARCHAR2 ist gut für reine ASCII, ist NVARCHAR2 gut für UTF-8.

Wenn Sie wirklich nicht den Zeichensatz ändern, dass Orakel dann verwenden, wie etwa Base64 Ihre Daten codiert, bevor sie in der Datenbank zu speichern. Auf diese Weise können Sie Zeichen von jedem Zeichensatz akzeptieren und speichern sie als ISO-8859-1 (weil Base64 ausgeben wird eine Teilmenge des ASCII-Zeichensatzes, der genau abbildet ISO-8859-1). Base64-Codierung wird die Länge der Saite von im Durchschnitt erhöhen, 37%

Wenn Ihre Daten gehen ist immer nur als HTML angezeigt werden dann könnten Sie auch HTML-Entitäten speichern, wie Sie vorgeschlagen, aber bewusst sein, dass eine einzelne Einheit pro unkodierte Zeichen 10 Zeichen lang sein kann z.B. θ heißt ϑ

Ich hatte mit diesem Problem konfrontiert: „?“ Die Latinamerican Sonderzeichen werden als gespeicherte oder „¿“ in meiner Oracle Datenbank ... Ich kann die NLS_CHARACTER_SET ändern, weil wir nicht die Datenbankbesitzer sind.

So fand ich eine Abhilfe:

1) ASP.NET-Code Erstellen Sie eine Funktion, dass Konvertiten String in hexadezimalen Zeichen:

    public string ConvertirStringAHex(String input)
    {
        Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
        Byte[] stringBytes = encoding.GetBytes(input);
        StringBuilder sbBytes = new StringBuilder(stringBytes.Length);
        foreach (byte b in stringBytes)
        {
            sbBytes.AppendFormat("{0:X2}", b);
        }
        return sbBytes.ToString();
    }

2) Übernehmen Sie die Funktion oben auf die Variable, die Sie kodieren wollen, wie diese

     myVariableHex = ConvertirStringZHex( myVariable );

In ORACLE, verwenden Sie die folgende:

 PROCEDURE STORE_IN_TABLE( iTEXTO IN VARCHAR2 )
 IS
 BEGIN
   INSERT INTO myTable( SPECIAL_TEXT )  
   VALUES ( UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW( iTEXTO ));
   COMMIT;
 END;

Natürlich iTEXTO ist die Oracle-Parameter, der den Wert von "myVariableHex" von ASP.NET-Code erhält.

Hope es hilft ... wenn es etwas gibt, pls zu verbessern, zögern Sie nicht Ihre Kommentare zu schreiben.

Quellen: http: / /www.nullskull.com/faq/834/convert-string-to-hex-and-hex-to-string-in-net.aspx https://forums.oracle.com/thread/44799

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top