5 Stimmen

Oracle Unicode-Problem bei Verwendung von NLS_CHARACTERSET ist WE8ISO8859P1 und NLS_NCHAR_CHARACTERSET ist AL16UTF16, und ColdFusion als Programmiersprache

Ich habe 2 Oracle 10g Datenbanken, XE und Enterprise

XE

enter image description here

enter image description here

Unternehmen

enter image description here

enter image description here

und dies sind die Datentypen, die ich in der Testtabelle verwendet habe

enter image description here

enter image description here

und dann habe ich versucht zu testen, ob ich ein Unicode-Zeichen aus http://www.sustainablegis.com/unicode/

und die Ergebnisse sind

XE

enter image description here

Unternehmen

enter image description here

für diesen Test verwende ich ColdFusion 9 Developer Edition

<cfprocessingDirective pageencoding="utf-8"> 
<cfset setEncoding("form","utf-8")>

<form action="" method="post">
Unicode : <br>
<textarea name="txaUnicode" id="txaUnicode" cols="50" rows="10"></textarea>
<br><br>
Language : <br>
<input type="Text" name="txtLanguage" id="txtLanguage">
<br><br>
<input type="Submit">
</form>

<cfset dsn = "theDSN">

<cfif StructKeyExists(FORM, "FIELDNAMES")>
    <cfquery name="qryInsert" datasource="#dsn#">
        INSERT INTO UNICODE
        (
            C_VARCHAR2,
            C_CHAR,
            C_CLOB,
            C_NVARCHAR2,
            LANGUAGE
        )
        VALUES
        (
            <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXAUNICODE#">,
            <cfqueryparam cfsqltype="CF_SQL_CHAR" value="#FORM.TXAUNICODE#">,
            <cfqueryparam cfsqltype="CF_SQL_LONGVARCHAR" value="#FORM.TXAUNICODE#">,
            <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXAUNICODE#">,
            <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXTLANGUAGE#">
        )
    </cfquery>
</cfif>

<cfquery name="qryUnicode" datasource="#dsn#">
    SELECT  *
    FROM    UNICODE
    ORDER BY    LANGUAGE
</cfquery>

<table border="1">
    <thead>
        <tr>
            <th>LANGUAGE</th>
            <th>C_VARCHAR2</th>
            <th>C_CHAR</th>
            <th>C_CLOB</th>
            <th>C_NVARCHAR2</th>
        </tr>
     </thead>
     <tbody>
        <cfoutput query="qryUnicode">
            <tr>
                <td>#qryUnicode.LANGUAGE#</td>
                <td>#qryUnicode.C_VARCHAR2#</td>
                <td>#qryUnicode.C_CHAR#</td>
                <td>#qryUnicode.C_CLOB#</td>
                <td>#qryUnicode.C_NVARCHAR2#</td>
            </tr>
        </cfoutput>
    </tbody>
</table>

aus diesem Leitfaden http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297 Ich denke, für meine Enterprise-Datenbank sollte es dasselbe produzieren wie XE (zumindest für NVARCHAR2-Spalte), da die typische Lösung aus diesem Führer sagte:

  • Verwendung der Datentypen NCHAR und NVARCHAR2 zum Speichern von Unicode-Zeichen
  • WE8ISO8859P1 als Datenbankzeichensatz beibehalten
  • AL16UTF16 als nationalen Zeichensatz verwenden

Wie kann ich also erreichen, dass es auch in meiner Enterprise-Datenbank funktioniert?

Dankeschön :)

1voto

el vis Punkte 1292

Die erste Datenbank speichert Werte in utf-8-Kodierung, die zweite in iso-8859-1 (neben N-Datentypen), aber Sie schreiben beide Werte in utf-8 aus, so dass der erste in Ordnung ist, aber der zweite falsch dekodiert wird.

1voto

Salman Hameed Punkte 11

Die WE8ISO88591-Kodierung hat einen begrenzten Zeichensatz und kann nicht alle Unicode-Zeichen speichern. Bitte beachten Sie http://en.wikipedia.org/wiki/ISO/IEC_8859-1 für die Liste der unterstützten Zeichen.

0voto

FerranB Punkte 33783

Der erste Schritt besteht darin, die NLS-Umgebungsvariablen zu überprüfen, da sie die Konvertierung bestimmen (falls erforderlich). Prüfen Sie auch den Inhalt für NLS_SESSION_PARAMETERS innerhalb einer coldfussion-Seite .

0voto

schlenk Punkte 6782

Die NVARCHAR2-Sache in Kombination mit WE8ISO88591 hat eine unangenehme Nebenwirkung, wenn Sie Literale in Abfragen verwenden. Die gesamte Abfrage wird durch die NLS_CHARSET-Kodierung konvertiert, wenn sie also Ihre Zeichen nicht kodieren kann, könnten Sie in Schwierigkeiten geraten. Aber das sollte bei gebundenen Parametern nicht passieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X