No MariaDB, o agrupamento pode ser aplicado em vários níveis. O agrupamento pode ser aplicado no nível do servidor, no nível da conexão, no nível do banco de dados, no nível da tabela e até mesmo no nível da coluna.
Também é possível especificar uma ordenação no nível da consulta, para que ela substitua qualquer ordenação que tenha sido aplicada nos níveis de banco de dados, tabela ou coluna.
O MariaDB oferece várias opções para retornar o agrupamento em vários níveis.
Mostrar a conexão, servidor e agrupamento de banco de dados
Podemos usar o
SHOW VARIABLES
instrução administrativa com o LIKE
cláusula para retornar variáveis que incluem uma determinada string em seus nomes. Exemplo:
SHOW VARIABLES LIKE 'collation%';
Exemplo de resultado:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Estes são os resultados que obtenho no meu ambiente de teste. O resultado obtido dependerá de suas configurações.
Cada uma dessas variáveis separadas pode ser retornada separadamente, se necessário (veja abaixo).
Por padrão,
SHOW VARIABLES
mostra a SESSION
variáveis. Nesse caso, ele retorna os valores que estão em vigor para a conexão atual. Portanto, o exemplo anterior poderia ser reescrito da seguinte forma:
SHOW SESSION VARIABLES LIKE 'collation%';
Exemplo de resultado:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Alternativamente, você pode substituir
SESSION
com LOCAL
(que é sinônimo de SESSION
):SHOW LOCAL VARIABLES LIKE 'collation%';
Você também pode usar o
GLOBAL
modificador para exibir os valores que são usados para novas conexões com MariaDB. Exemplo:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Exemplo de resultado:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Agrupamento de servidores
O comando a seguir retorna o agrupamento padrão do servidor:
SELECT @@collation_server;
Exemplo de resultado:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Agrupamento em nível de conexão
Quando você executa uma consulta em um banco de dados MariaDB, o MariaDB usa várias variáveis do sistema para determinar qual conjunto de caracteres e agrupamento usar sempre que as consultas forem executadas. Se o cliente usar um conjunto de caracteres diferente do servidor, o MariaDB poderá traduzi-lo em um conjunto de caracteres e agrupamento apropriados.
Ao enviar os resultados da consulta de volta ao cliente, o MariaDB pode traduzir esses resultados de volta para um conjunto de caracteres diferente, se necessário. O MariaDB usa variáveis do sistema para determinar quais conjuntos de caracteres e agrupamentos devem ser usados em cada uma dessas etapas.
O seguinte destaca o agrupamento de conexão (você pode usar a mesma sintaxe para qualquer uma das variáveis do sistema):
SELECT @@collation_connection;
Exemplo de resultado:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Você também pode retornar todas as variáveis de sistema do conjunto de caracteres com a seguinte 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/ | +--------------------------+--------------------------------------------------------+
Agrupamento em nível de banco de dados
A instrução a seguir pode ser usada para verificar o agrupamento de um determinado banco de dados:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Exemplo de resultado:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Outra maneira de fazer isso é usar uma declaração como esta:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Exemplo de resultado:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
O uso desse segundo método permite obter os resultados sem alternar o banco de dados.
Aqui está usando um banco de dados diferente:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Exemplo de resultado:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Este é o banco de dados de teste que foi criado quando instalei o MariaDB pela primeira vez.
Agrupamento em nível de tabela
A instrução a seguir retorna várias colunas que fornecem informações sobre quaisquer tabelas correspondentes. Uma dessas colunas é chamada Collation , e fornece o agrupamento de todas as tabelas correspondentes.
SHOW TABLE STATUS LIKE '%Pets%';
Exemplo de resultado (usando saída 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
Neste caso, obtive informações sobre uma tabela chamada
Pets
. Podemos ver que o Collation
coluna contém utf8mb4_general_ci
, que é o agrupamento da tabela. Esta declaração também aceita outras cláusulas, como
FROM
, WHERE
e IN
, então isso lhe dá algumas opções ao construir sua declaração. Outra maneira de obter informações de agrupamento sobre suas tabelas é executar uma consulta em
information_schema.tables
:SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Exemplo de resultado:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Agrupamento em nível de coluna
A execução da consulta a seguir retorna informações sobre cada coluna no
Pets
tabela. Isso inclui as informações de agrupamento. SHOW FULL COLUMNS FROM Pets;
Exemplo de resultado:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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
. Nesse caso, podemos escolher apenas as colunas que nos interessam:SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Exemplo de resultado:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
E outra opção que temos em nosso kit de ferramentas é verificar o
CREATE TABLE
declaração de nossa tabela. Assim:
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 | +-------+-------------------------------+
No entanto, as informações do conjunto de caracteres e da ordenação só serão retornadas se forem diferentes da ordenação padrão da tabela. Neste exemplo, as informações de agrupamento não diferem e, portanto, nenhuma informação de agrupamento foi retornada.
Vamos alterar o agrupamento:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
E execute
SHOW CREATE TABLE
novamente: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 | +-------+-------------------------------+
Desta vez, podemos ver o novo conjunto de caracteres e configurações de agrupamento em relação ao
PetName
coluna.