Comprensión integral de los conjuntos de caracteres de la base de datos Oracle
El juego de caracteres de Oracle es un conjunto de símbolos para la interpretación de datos de bytes que tienen diferentes tamaños y tolerancias mutuas.
La arquitectura habilitada para idiomas nacionales de Oracle le permite almacenar, procesar y recuperar datos en idiomas localizados. Adapta automáticamente herramientas de bases de datos, mensajes de error, criterios de clasificación, fechas, horas, monedas, números y calendarios a idiomas y plataformas localizados.
El parámetro más importante que afecta al juego de caracteres de la base de datos Oracle es el parámetro NLS_lang. Su formato es el siguiente:
NLS_lang=idioma_territorio. Conjunto de caracteres
Tiene tres componentes (idioma, región y conjunto de caracteres), cada uno de los cuales controla las características de un subconjunto de NLS. Estos incluyen:
Idioma especifica el idioma de los mensajes del servidor, región especifica el formato de fecha y número del servidor y juego de caracteres especifica el juego de caracteres. Tales como: American_America zhs 16 gbk.
De la composición de NLS_Lang, podemos ver que la tercera parte sí afecta el juego de caracteres de la base de datos. Por lo tanto, siempre que el conjunto de caracteres entre las dos bases de datos sea el mismo que el de la tercera parte, pueden importar y exportar datos entre sí. El único impacto en el frente es si la información solicitada es chino o inglés.
Cómo consultar el juego de caracteres de Oracle
Muchas personas han encontrado fallas en la importación de datos debido a diferentes juegos de caracteres. Esto involucra tres juegos de caracteres, uno es el juego de caracteres del servidor Oracle, el otro es el juego de caracteres del cliente Oracle y el tercero es el juego de caracteres del archivo dmp. Al importar datos, los tres conjuntos de caracteres deben ser coherentes para una importación correcta.
1. Consulta el juego de caracteres del servidor Oracle.
Hay muchas formas de encontrar el conjunto de caracteres del servidor Oracle. El método de consulta más intuitivo es el siguiente:
SQL select userenv ('idioma') de dual
;Resultados como se muestra a continuación: American_America. ZHS £16.
2. ¿Cómo consultar el juego de caracteres de un archivo dmp?
El archivo dmp exportado por la herramienta exp de Oracle también contiene información del juego de caracteres. El segundo y tercer bytes del archivo dmp registran el juego de caracteres del archivo dmp. Si el archivo dmp no es grande, como solo unos pocos metros o decenas de metros, puede usar UltraEdit (modo 16 hexadecimal) para abrirlo, ver el contenido del segundo y tercer bytes, como 0354, y luego usar el siguiente SQL para descubrir su juego de caracteres correspondiente:
SQL seleccione nls _ charset _ name (to _ number ('0354', 'xxxx') de dual; ZHS16GBK
Si el El archivo dmp es grande, por ejemplo más de 2G (este es también el caso más común), se puede abrir lenta o completamente con un editor de texto. Puede usar el siguiente comando (en un host Unix):
Luego use el SQL anterior para obtener el conjunto de caracteres correspondiente.
Esto es relativamente simple, es el NLS_LANG correspondiente a OracleHome en el registro. configúrelo usted mismo en la ventana Dos, por ejemplo:
p>set nls_lang=AMERICAN_AMERICA.
Esto solo afecta la variable de entorno en esta ventana. En plataformas Unix, es el entorno. variable NLS_lang.
$echo.$USNLSlangUS.
ZHS16GBK
Si los resultados de la verificación muestran que los juegos de caracteres del servidor y del cliente son inconsistentes, modifíquelos al mismo juego de caracteres que el servidor.
Modificar el juego de caracteres de Oracle
Como se mencionó anteriormente, los juegos de caracteres de Oracle son mutuamente inclusivos.
Por ejemplo, us7ascii es un subconjunto de zhs16gbk. No habrá problemas de interpretación de datos ni pérdida de datos de us7ascii a zhs16gbk. Se supone que Utf8 es el más grande de todos los conjuntos de caracteres porque está basado en Unicode y almacena caracteres en bytes dobles (y por lo tanto ocupa más espacio de almacenamiento).
Una vez creada una base de datos, en teoría no se puede cambiar el juego de caracteres de la base de datos. Por lo tanto, es muy importante considerar qué conjunto de caracteres utilizar al comienzo del diseño y la instalación. Según la descripción oficial de Oracle, se admite la conversión de conjuntos de caracteres de subconjuntos a superconjuntos y viceversa. Si no existe una relación entre subconjuntos y superconjuntos entre dos conjuntos de caracteres, Oracle no admite la conversión de conjuntos de caracteres. Para los servidores de bases de datos, la modificación incorrecta de los juegos de caracteres tendrá muchas consecuencias impredecibles que pueden afectar gravemente el funcionamiento normal de la base de datos. Por lo tanto, es necesario confirmar si existe una relación de subconjunto o superconjunto entre los dos juegos de caracteres antes de la modificación. . En términos generales, no se recomienda modificar el juego de caracteres en el lado del servidor de la base de datos Oracle a menos que sea absolutamente necesario. En particular, no existe una relación de subconjunto o superconjunto entre los dos juegos de caracteres de uso común ZHS16GBK y zhs 16 cgb 231280 0280, por lo que teóricamente no se admite la conversión mutua entre los dos juegos de caracteres.
Modificar el juego de caracteres del lado del servidor (no recomendado):
Antes de Oracle 8, podía cambiar el juego de caracteres de la base de datos modificando directamente los accesorios de la tabla del diccionario de datos$. Sin embargo, después de Oracle8, hay al menos tres tablas del sistema que registran la información del juego de caracteres de la base de datos. Simplemente cambiar la tabla props$ está incompleto y puede causar consecuencias graves. El método de modificación correcto es el siguiente:
$ sqlplus/nolog SQLconn/as SYSDBA;
Si el servidor de la base de datos se inicia en este momento, primero ejecute el comando SHUTDOWN IMMEDIATE para apagar el servidor de base de datos y luego ejecute el siguiente comando:
Carga SQLSTARTUP;
El sistema SQLALTER habilita sesiones restringidas;
El sistema SQLALTER establece JOB_QUEUE_PROCESSES = 0;
p>
Configuración del sistema SQLALTER Proceso AQ = 0;
La base de datos SQLALTER está abierta;
Juego de caracteres de la base de datos SQLALTER zhs 16 gbk;
Base de datos SQLALTER nacional conjunto de caracteres zhs 16 gbk;
SQLSHUTDOWN inmediatamente;SQLSTARTUP
Modificar el conjunto de caracteres del archivo dmp:
Como se mencionó anteriormente, el segundo y tercer bytes del archivo dmp En el archivo se registra información del juego de caracteres, por lo que puede "engañar" a Oracle modificando directamente el contenido del segundo y tercer bytes del archivo dmp. En teoría, solo se puede modificar de un subconjunto a un superconjunto, pero en muchos casos se puede modificar sin que exista una relación entre subconjunto y superconjunto. Algunos juegos de caracteres de uso común, como US7ASCII, WE8ISO 859P1, zhs 16 cgb 231280 0280, ZHS16GBK, básicamente se pueden modificar. Debido a que solo se cambió el archivo dmp, el impacto no es significativo.
Existen muchos métodos de modificación específicos. El más sencillo es utilizar UltraEdit directamente para modificar el segundo y tercer byte del archivo dmp.
Por ejemplo, si desea cambiar el juego de caracteres de un archivo dmp a ZHS16GBK, puede usar el siguiente SQL para encontrar el código hexadecimal de 16 correspondientes a ese juego de caracteres:
SQL select to _ char (nls _ charset _ id ('zhs 16 gbk', 'xxxx') de dual; 0354
Luego modifique los bytes 2 y 3 del archivo dmp a 0354
Si el archivo dmp es demasiado grande., debe usar el método del programa. Alguien en Internet escribió un programa de conversión usando procedimientos almacenados de Java (la ventaja de usar procedimientos almacenados de Java es que es más problemático, pero pasé la prueba en Windows). La opción JVM debe estar instalada en la base de datos Oracle.