En MySQL, la intercalación se puede aplicar en muchos niveles. Se puede aplicar a nivel de servidor, a nivel de conexión, a nivel de base de datos, a nivel de tabla e incluso a nivel de columna. También puede especificar una intercalación en sus consultas que anulará cualquier intercalación que se haya aplicado en los niveles de base de datos, tabla o columna.
A continuación, le mostramos cómo averiguar qué intercalación se está aplicando en cada uno de estos niveles.
Acceso directo para intercalación de conexión, servidor y base de datos
La forma más rápida de obtener información de intercalación para la conexión, el servidor y la base de datos es usar la siguiente declaración. Esta declaración devuelve todas las variables del sistema que comienzan con collation
:
SHOW VARIABLES LIKE 'collation%';
Esto devuelve la intercalación del servidor, la conexión y la base de datos. Así:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_0900_ai_ci | | collation_database | utf8_general_ci | | collation_server | utf8mb4_0900_ai_ci | +----------------------+--------------------+
También puede devolver cada una de estas variables del sistema por separado si es necesario. Consulte a continuación las instrucciones sobre cómo hacerlo.
Intercalación a nivel de servidor
Ejecutar el siguiente comando devuelve la intercalación predeterminada del servidor.
SELECT @@collation_server;
Resultado de ejemplo:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_0900_ai_ci | +--------------------+
Cotejo a nivel de conexión
Cuando ejecuta una consulta en una base de datos MySQL, MySQL usa un conjunto de variables del sistema para determinar qué conjunto de caracteres y colación usar cada vez que se ejecutan las consultas. Si el cliente usa un juego de caracteres diferente al del servidor, MySQL puede traducirlo a un juego de caracteres y una intercalación apropiados.
Al enviar los resultados de la consulta al cliente, MySQL puede traducir estos resultados a un conjunto de caracteres completamente diferente si es necesario. MySQL usa variables del sistema para determinar qué conjuntos de caracteres y colaciones usar en cada uno de estos pasos.
Lo siguiente destaca la intercalación de conexiones (puede usar la misma sintaxis para cualquiera de las variables del sistema):
SELECT @@collation_connection;
Resultado de ejemplo:
+------------------------+ | @@collation_connection | +------------------------+ | utf8mb4_0900_ai_ci | +------------------------+
También puede devolver todas las variables del sistema del conjunto de caracteres con la siguiente consulta:
SHOW VARIABLES LIKE 'character_set%';
Resultado de ejemplo:
+--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+
Cotejo a nivel de base de datos
La siguiente declaración se puede utilizar para comprobar la intercalación de una base de datos determinada:
USE Music; SELECT @@character_set_database, @@collation_database;
Resultado de ejemplo:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8 | utf8_general_ci | +--------------------------+----------------------+
Como alternativa, puede usar la siguiente instrucción (que elimina la necesidad de cambiar la base de datos predeterminada):
SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'Music';
Resultado de ejemplo:
+----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8 | utf8_general_ci | +----------------------------+------------------------+
Cotejo a nivel de tabla
Ejecutar la siguiente declaración devolverá un montón de columnas que brindan información sobre cualquier tabla o tablas coincidentes. Una de estas columnas se llama Collation y proporciona la recopilación de todas las tablas coincidentes.
SHOW TABLE STATUS LIKE '%Artists%';
Por supuesto, deberá reemplazar %Artists%
con su propio nombre de tabla. Y puede omitir los signos de porcentaje si no cree que sean necesarios. Esta declaración también acepta otras cláusulas, como FROM
, WHERE
y IN
, por lo que esto le brinda algunas opciones al crear su estado de cuenta.
Un problema con la declaración anterior es que devuelve muchas columnas y es posible que se vea obligado a desplazarse hacia los lados para encontrar la columna de clasificación. Si solo está interesado en la información de colación, puede consultar information_schema.tables
. También puede devolver la intercalación de todas las tablas dentro de una base de datos determinada si es necesario. Así es como se hace:
SELECT table_schema, table_name, table_collation FROM information_schema.tables WHERE table_schema = 'Music';
Resultados de ejemplo:
+--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | Music | Albums | utf8_general_ci | | Music | Artists | utf8_general_ci | | Music | Genres | utf8_general_ci | +--------------+------------+-----------------+
Intercalación a nivel de columna
La ejecución de la siguiente consulta devuelve información sobre cada columna de una tabla determinada. Esto incluye la información de colación.
SHOW FULL COLUMNS FROM Artists;
Eso da como resultado que se devuelvan muchas columnas con todo tipo de información sobre la columna, incluida la intercalación.
Puede reducir el número de columnas devueltas haciendo esto:
SELECT column_name, character_set_name, collation_name FROM information_schema.columns WHERE table_name = 'Artists';
Resultado de ejemplo:
+-------------+--------------------+-----------------+ | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME | +-------------+--------------------+-----------------+ | ArtistId | NULL | NULL | | ArtistName | utf8 | utf8_spanish_ci | | ActiveFrom | NULL | NULL | +-------------+--------------------+-----------------+
También puede ejecutar SHOW CREATE TABLE
declaración para mostrar una definición de la tabla (que incluye sus columnas).
SHOW CREATE TABLE Artists;
Esto devuelve algo como esto:
+---------+--------------------------------+ | Table | Create Table | +---------+--------------------------------+ | Artists | CREATE TABLE `Artists` ( `ArtistId` int(11) NOT NULL AUTO_INCREMENT, `ArtistName` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL, `ActiveFrom` datetime NOT NULL, PRIMARY KEY (`ArtistId`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 | +---------+--------------------------------+
Sin embargo, la información sobre el juego de caracteres y la intercalación solo se devuelve si difieren de la intercalación predeterminada de la tabla. En este ejemplo, configuro explícitamente el ArtistName
columna a una intercalación diferente solo con fines de demostración (de lo contrario, la información de la intercalación no se habría devuelto).