sql >> Base de Datos >  >> RDS >> MariaDB

Mostrar la intercalación en MariaDB

En MariaDB, la intercalación se puede aplicar en muchos niveles. La intercalación 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 es posible especificar una intercalación en el nivel de consulta, de modo que anule cualquier intercalación que se haya aplicado en los niveles de base de datos, tabla o columna.

MariaDB proporciona una serie de opciones para devolver la intercalación en los distintos niveles.

Mostrar la intercalación de la conexión, el servidor y la base de datos

Podemos usar el SHOW VARIABLES declaración administrativa con el LIKE cláusula para devolver variables que incluyen una determinada cadena dentro de sus nombres.

Ejemplo:

SHOW VARIABLES LIKE 'collation%';

Resultado de ejemplo:

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

Estos son los resultados que obtengo en mi entorno de prueba. El resultado que obtenga dependerá de su configuración.

Cada una de estas variables separadas se puede devolver por separado si es necesario (ver más abajo).

Por defecto, SHOW VARIABLES muestra la SESSION variables En este caso, devuelve los valores que están en vigor para la conexión actual.

Por lo tanto, el ejemplo anterior podría reescribirse de la siguiente manera:

SHOW SESSION VARIABLES LIKE 'collation%';

Resultado de ejemplo:

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

Alternativamente, puede reemplazar SESSION con LOCAL (que es un sinónimo de SESSION ):

SHOW LOCAL VARIABLES LIKE 'collation%';

También puede utilizar el GLOBAL modificador para mostrar los valores que se utilizan para las nuevas conexiones a MariaDB.

Ejemplo:

SHOW GLOBAL VARIABLES LIKE 'collation%';

Resultado de ejemplo:

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

Colección de servidores

El siguiente comando devuelve la intercalación predeterminada del servidor:

SELECT @@collation_server;

Resultado de ejemplo:

+--------------------+
| @@collation_server |
+--------------------+
| utf8mb4_general_ci |
+--------------------+

Cotejo a nivel de conexión

Cuando ejecuta una consulta en una base de datos de MariaDB, MariaDB 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, MariaDB puede traducirlo a un juego de caracteres y una intercalación apropiados.

Al enviar los resultados de la consulta al cliente, MariaDB puede traducir estos resultados a un conjunto de caracteres diferente si es necesario. MariaDB 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 |
+------------------------+
| utf8_general_ci        |
+------------------------+

También puede devolver todas las variables del sistema del conjunto de caracteres con la siguiente consulta:

SHOW VARIABLES LIKE 'character_set%';

Resultado:

+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | utf8mb4                                                |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | utf8mb4                                                |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/Cellar/mariadb/10.5.9/share/mysql/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 PetHouse;
SELECT @@character_set_database, @@collation_database;

Resultado de ejemplo:

+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_general_ci   |
+--------------------------+----------------------+

Otra forma de hacerlo es usar una declaración como esta:

SELECT 
    default_character_set_name, 
    default_collation_name 
FROM information_schema.schemata 
WHERE schema_name = 'PetHouse';

Resultado de ejemplo:

+----------------------------+------------------------+
| default_character_set_name | default_collation_name |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+

El uso de este segundo método le permite obtener los resultados sin cambiar la base de datos.

Aquí está usando una base de datos diferente:

SELECT 
    default_character_set_name, 
    default_collation_name 
FROM information_schema.schemata 
WHERE schema_name = 'test';

Resultado de ejemplo:

+----------------------------+------------------------+
| default_character_set_name | default_collation_name |
+----------------------------+------------------------+
| latin1                     | latin1_swedish_ci      |
+----------------------------+------------------------+

Esta es la base de datos de prueba que se creó cuando instalé MariaDB por primera vez.

Cotejo a nivel de tabla

La siguiente declaración devuelve una cantidad 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 '%Pets%';

Resultado de ejemplo (usando salida vertical):

*************************** 1. row ***************************
            Name: Pets
          Engine: InnoDB
         Version: 10
      Row_format: Dynamic
            Rows: 8
  Avg_row_length: 2048
     Data_length: 16384
 Max_data_length: 0
    Index_length: 32768
       Data_free: 0
  Auto_increment: NULL
     Create_time: 2021-03-30 09:10:38
     Update_time: 2021-03-30 09:16:39
      Check_time: NULL
       Collation: utf8mb4_general_ci
        Checksum: NULL
  Create_options: 
         Comment: 
Max_index_length: 0
       Temporary: N

En este caso, obtuve información sobre una tabla llamada Pets . Podemos ver que la Collation la columna contiene utf8mb4_general_ci , que es la intercalación de la tabla.

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.

Otra forma de obtener información de intercalación sobre sus tablas es ejecutar una consulta contra information_schema.tables :

SELECT 
    table_schema, 
    table_name, 
    table_collation 
FROM information_schema.tables 
WHERE table_schema = 'PetHouse';

Resultado de ejemplo:

+--------------+---------------+--------------------+
| table_schema | table_name    | table_collation    |
+--------------+---------------+--------------------+
| pethouse     | vpettypecount | NULL               |
| pethouse     | Pets          | utf8mb4_general_ci |
| pethouse     | Owners        | utf8mb4_general_ci |
| pethouse     | PetTypes      | utf8mb4_general_ci |
+--------------+---------------+--------------------+

Intercalación a nivel de columna

Ejecutar la siguiente consulta devuelve información sobre cada columna en Pets mesa. Esto incluye la información de colación.

SHOW FULL COLUMNS FROM Pets;

Resultado de ejemplo:

+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field     | Type        | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| PetId     | int(11)     | NULL               | NO   | PRI | NULL    |       | select,insert,update,references |         |
| PetTypeId | int(11)     | NULL               | NO   | MUL | NULL    |       | select,insert,update,references |         |
| OwnerId   | int(11)     | NULL               | NO   | MUL | NULL    |       | select,insert,update,references |         |
| PetName   | varchar(60) | utf8mb4_general_ci | NO   |     | NULL    |       | select,insert,update,references |         |
| DOB       | date        | NULL               | YES  |     | NULL    |       | select,insert,update,references |         |
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+

Alternativamente, podemos consultar information_schema.columns . En este caso, podemos elegir solo las columnas que nos interesan:

SELECT 
    column_name, 
    character_set_name, 
    collation_name 
FROM information_schema.columns
WHERE table_name = 'Pets';

Resultado de ejemplo:

+-------------+--------------------+--------------------+
| column_name | character_set_name | collation_name     |
+-------------+--------------------+--------------------+
| PetId       | NULL               | NULL               |
| PetTypeId   | NULL               | NULL               |
| OwnerId     | NULL               | NULL               |
| PetName     | utf8mb4            | utf8mb4_general_ci |
| DOB         | NULL               | NULL               |
+-------------+--------------------+--------------------+

Y otra opción que tenemos en nuestro kit de herramientas es revisar CREATE TABLE declaración de nuestra mesa.

Así:

SHOW CREATE TABLE Pets;

Resultado:

+-------+------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+-------+------------------------------+
| Pets  | CREATE TABLE `Pets` (
  `PetId` int(11) NOT NULL,
  `PetTypeId` int(11) NOT NULL,
  `OwnerId` int(11) NOT NULL,
  `PetName` varchar(60) NOT NULL,
  `DOB` date DEFAULT NULL,
  PRIMARY KEY (`PetId`),
  KEY `PetTypeId` (`PetTypeId`),
  KEY `OwnerId` (`OwnerId`),
  CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`PetTypeId`) REFERENCES `PetTypes` (`PetTypeId`),
  CONSTRAINT `pets_ibfk_2` FOREIGN KEY (`OwnerId`) REFERENCES `Owners` (`OwnerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------+

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, la información de intercalación no difieren, por lo que no se devolvió información de intercalación.

Cambiemos la intercalación:

ALTER TABLE Pets 
MODIFY PetName VARCHAR(255) 
    CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;

Y ejecuta SHOW CREATE TABLE de nuevo:

SHOW CREATE TABLE Pets;

Resultado:

+-------+------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+-------+------------------------------+
| Pets  | CREATE TABLE `Pets` (
  `PetId` int(11) NOT NULL,
  `PetTypeId` int(11) NOT NULL,
  `OwnerId` int(11) NOT NULL,
  `PetName` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `DOB` date DEFAULT NULL,
  PRIMARY KEY (`PetId`),
  KEY `PetTypeId` (`PetTypeId`),
  KEY `OwnerId` (`OwnerId`),
  CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`PetTypeId`) REFERENCES `PetTypes` (`PetTypeId`),
  CONSTRAINT `pets_ibfk_2` FOREIGN KEY (`OwnerId`) REFERENCES `Owners` (`OwnerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------+

Esta vez podemos ver el nuevo conjunto de caracteres y la configuración de intercalación en PetName columna.