sql >> Base de Datos >  >> RDS >> Mysql

Cómo encontrar la intercalación en MySQL

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).