10.6. UTF8 para metadatos

MySQL 5.0

10.6. UTF8 para metadatos

Los metadatos son los datos acerca de los datos. Cualquier cosa que describa la base de datos, opuestamente a los contenidos de la misma, son metadatos. Así, los nombres de columna, nombres de base de datos, nombres de usuario, nombres de versión y la mayoría de resultados de son metadatos.

La representación de los metadatos debe satisfacer estos requerimientos:

  • Todos los metadatos deben ser del mismo conjunto de caracteres. De otro modo no funcionaría correctamente ya que distintos registros en la misma columna tendrían distintos conjuntos de caracteres.

  • Los metadatos deben incluir todos los caracteres en todos los idiomas. De otro modo, los usuarios no serían capaces de nombrar tablas y columnas en su propio idioma.

Para satisfacer ambos requerimientos, MySQL guarda los metadatos en un conjunto de caracteres Unicode, llamado UTF8. Esto no causa ningún problema si no se utilizan nunca caracteres acentuados o no-latinos. Si se utilizan, debe tenerse en cuenta que los metadatos están en UTF8.

Esto significa que las funciones , , , y tienen el conjunto de caracteres UTF8 por defecto, al igual que sinónimos como y .

El servidor activa la variable de sistema con el nombre del conjunto de caracteres de los metadatos:

mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| character_set_system | utf8  |
+----------------------+-------+

El almacenamiento de metadatos usando Unicode no significa que las cabeceras de columnas y los resultados de la función estén en el conjunto de caracteres por defecto. Cuando introduce , el nombre mismo vuelve del servidor al cliente con el conjunto de caracteres determinado por el comando . Más específicamente, el conjunto de caracteres usado se determina por el valor de la variable de sistema . Si esta variable se pone a , no se realiza ninguna conversión y el servidor devuelve metadatos usando su conjunto de caracteres original (el conjunto indicado por ).

Para que el servidor pase los resultados de metadatos con un conjunto de caracteres no-UTF8, utilícese para forzar al servidor a hacer una conversión del conjunto de caracteres (consulte Sección 10.3.6, “Conjunto de caracteres y colación de la conexión”), o hacer que el cliente haga la conversión. Es más eficiente que el cliente haga la conversión, pero esta opción no está disponible para todos los clientes.

Si utiliza (por ejemplo) la función para comparación o asignación dentro de un comando, no se preocupe. MySQL realiza algunas conversiones automáticas.

SELECT * FROM Table1 WHERE USER() = latin1_column;

Esta sentencia funciona porque los contenidos de se convierten automáticamente a UTF8 antes de la comparación.

INSERT INTO Table1 (latin1_column) SELECT USER();

Esta sentencia funciona porque los contenidos de se convierten automáticamente a antes de la asignación. La conversión automática no está completamente implementada aún, pero debería funcionar correctamente en versiones posteriores.

Aunque la conversión automática no está en el estándar SQL, el documento estándar SQL dice que cada conjunto de caracteres es (en términos de caracteres soportados) un “subconjunto” de Unicode. Puesto que es un principio bien conocido que “lo que se aplica a un superconjunto se puede aplicar a un subconjunto”, creemos que una colación para Unicode se puede aplicar para comparaciones con cadenas de caracteres no-Unicode.