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 SHOW
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
SHOW
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 USER()
,
CURRENT_USER()
, DATABASE()
,
y VERSION()
tienen el conjunto de caracteres
UTF8 por defecto, al igual que sinónimos como
SESSION_USER()
y
SYSTEM_USER()
.
El servidor activa la variable de sistema
character_set_system
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 DESCRIBE
estén
en el conjunto de caracteres
character_set_system
por defecto. Cuando
introduce SELECT column1 FROM t
, el nombre
column1
mismo vuelve del servidor al cliente
con el conjunto de caracteres determinado por el comando
SET NAMES
. Más específicamente, el conjunto
de caracteres usado se determina por el valor de la variable de
sistema character_set_results
. Si esta
variable se pone a NULL
, no se realiza ninguna
conversión y el servidor devuelve metadatos usando su conjunto de
caracteres original (el conjunto indicado por
character_set_system
).
Para que el servidor pase los resultados de metadatos con un
conjunto de caracteres no-UTF8, utilícese SET
NAMES
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 USER()
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
latin1_column
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
USER()
se convierten automáticamente a
latin1
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.