2011-02-23 19 views
5

tengo 2 base de datos Oracle 10g, XE y Empresaproblema Oracle Unicode cuando se utiliza NLS_CHARACTERSET es WE8ISO8859P1 y NLS_NCHAR_CHARACTERSET es AL16UTF16, y ColdFusion como lenguaje de programación

XE

enter image description here

enter image description here

Empresa

enter image description here

enter image description here

y esto son el tipo de datos que he uso en la tabla de prueba

enter image description here

enter image description here

y luego traté de probar a insertar algún Unicode char desde http://www.sustainablegis.com/unicode/

y los resultados son

XE

enter image description here

Empresa

enter image description here

para esta prueba, yo uso ColdFusion 9 edición desarrollador

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

de esta guía http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297 pienso para mi base de datos de la empresa debe producir lo mismo que XE (al menos para la columna NVARCHAR2) ya que el solución típica de esa guía dijo:

  • Uso NCHAR y tipos de datos NVARCHAR2 para almacenar caracteres Unicode
  • Mantenga WE8ISO8859P1 como el carácter de base de datos creada
  • uso AL16UTF16 como el carácter nacional establece

Entonces, ¿cómo hacer que funcione también en mi base de datos Enterprise?

Gracias :)

Respuesta

0

El primer paso es comprobar las variables de entorno NLS porque determinan la conversión (si es necesario). También verifique el contenido para NLS_SESSION_PARAMETERS dentro de una página de fusión fría.

0

La cosa NVARCHAR2 combinada con WE8ISO88591 tiene un desagradable efecto secundario si utiliza literales en las consultas. Toda la consulta se convierte a través de la codificación NLS_CHARSET, por lo que si no puede codificar sus caracteres, puede tener problemas.Pero eso no debería suceder con los parámetros enlazados.

1

La primera base de datos almacena valores en codificación utf-8, segundo en iso-8859-1 (además de N-tipos de datos), sin embargo está escribiendo ambos valores en utf-8, así que el primero está bien, pero el segundo es incorrecto descifrado.

1

La codificación WE8ISO88591 tiene un juego de caracteres limitado y no puede almacenar todos los caracteres Unicode. Consulte http://en.wikipedia.org/wiki/ISO/IEC_8859-1 para ver una lista de los caracteres admitidos.

Cuestiones relacionadas