sábado, noviembre 22, 2008

Juego de caracteres en Oracle

Hola,

Aquí estoy, viernes noche moviendo una export Oracle para empezar luego la importación en un servidor nuevo (una migración en toda regla). Voy a aprovechar este tiempo muerto para terminar con el tema del juego de caracteres...

Ayer ya adelantaba algunas cositas. Voy a hacer un resumen y el que quiera profundizar puede ir a la nota Oracle que le indico).

El juego recomendado por Oracle es el Unicode. Es el denominado juego universal (estándar de facto en HTML, XML, etc.) y con él no nos va a faltar ningún carácter porque incluye todos los demás. Oracle lo recomienda en las notas 333489.1, 227330.1.

Básicamente nos dicen que no tendremos ningún problema para soportar cualquier cosa.

También remarcan que nos podemos arreglar muy bien con otros juegos, pero consideran que a la larga no elegir Unicode es un error.

Mitos y leyendas sobre Unicode:

1.-Hay gente que piensa de la siguiente forma: Unicode soporta todo, por lo que necesita muchos bytes para representar cada carácter, por lo tanto, la base de datos será muchísimo más grande.

La base de datos aumentará, pero no en esa medida. Los caracteres unicode tienen longitud variable. Los caracteres ASCII ocupan 1 byte. Los caracteres con tilde, el alfabeto árabe, el griego, el hebreo,... ocupan 2 bytes. Los caracteres chinos, indios, japoneses y coreanos ocupan 3 bytes, y el resto de caracteres complementarios 4 bytes.

2.-Otros dicen que afecta al rendimiento Oracle.

Sobre este tema la gente de Oracle asegura que en cada release que lanzan se ha optimizado el manejo de los caracteres unicode. Dicen que generalmente el "performance" de una base de datos Unicode es similar al de una base de datos "single-byte".

3.-Para los que piensan que hay problemas de integración.

Nos dicen que al ser Unicode un super-conjunto del resto de juegos no hay mayores problemas.

4.-¿Entonces no hay ningún problema con Unicode?

Para que se vea que no es cierto que todo es perfecto con Unicode la nota 119119.1 es muy clarificadora.

La nota 119119.1 trata de los juegos UTF8 (Unicode 2.1 en Oracle 8.0-8.1.6 y Unicode 3.0 de Oracle 8.1.7 a 10g) y AL32UTF8 (Unicode 3 en Oracle 9, Unicode 3.1 en Oracle 9.2 y Unicode 3.2 en Oracle 10.1).

Entre otras cosas se mencionan los siguiente problemillas:

  • Problemas en el acceso a bases de datos AL32UTF8 desde versiones 8i y anteriores.
  • Todo crece algo en comparación con juegos de 1 byte como son los populares WE8ISO8559P1 o WE8MSWIN1252. Sobre todo crecen los alfabetos diferentes a los idiomas occidentales.
  • Como los campos "crecen" al hacer la conversión se tiene que tener en cuenta el tamaño de las columnas (Recordemos que las columnas se especifican por defecto en bytes y no en número de caracteres).
  • Cuidado con las funciones ASCII y CHR. El código de un caracter depende del juego de caracteres.
  • El código del punto decimal también cambia.
  • Ahora en lugar de CHR() hay que usar Unistr() ya que Unistr devolverá el mismo valor para cualquier juego de caracteres que soporte el carácter.
  • El popular Toad no es capaz de tratar bases de datos UTF8 o AL16UTF16 (por lo menos en el momento de elaboración de la nota Oracle).
Bueno, no os quiero aburrir más. Sólo era eso. Una cosa es lo recomendado, pero antes de cambiar nada estudiarlo bien.

Ya sabéis la primera regla de la informática: Si funciona no lo toques :-)

Saludos.

P.D.: Ya he lanzado la importación y va bien. Mañana cuando termine esto retoque final y descanso merecido.

1 comentario:

Anónimo dijo...

Hola,

Tengo una base de datos en Oracle.
Y necesito insertar en una columna de una de las tablas caracteres especiales, asiaticos...
Defino esa columna de la tabla como nvarcha2 para poder insertar caracteres unicode.

¿Como puedo hacer en insert en la base de datos? ya que para los caracteres asiaticos y otros me graba ? a traves del toad.

¿Alguien me puede ayudar?