Como alterar o agrupamento padrão de uma tabela?

186
create table check2(f1 varchar(20),f2 varchar(20));

cria uma tabela com o agrupamento padrão latin1_general_ci;

alter table check2 collate latin1_general_cs;
show full columns from check2;

mostra o agrupamento individual das colunas como 'latin1_general_ci'.

Então, qual é o efeito do comando alter table?

simplfuzz
fonte
possível duplicata de Mudança agrupamento de banco
Michel Ayres
Você pode alterar a resposta correta, pois eu e muitos outros concordamos que a segunda é a correta.
Ahi Tuna

Respostas:

597

Para alterar o conjunto de caracteres padrão e agrupamento de uma tabela incluindo os das colunas existentes (observe a cláusula converter em ):

alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci;

A resposta foi editada, graças à solicitação de alguns comentários:

Deve evitar recomendar utf8. Quase nunca é o que você deseja e muitas vezes leva a bagunças inesperadas. O conjunto de caracteres utf8 não é totalmente compatível com UTF-8. O conjunto de caracteres utf8mb4 é o que você deseja se deseja UTF-8. - Rich Remer 28/03 '18 às 23:41

e

Isso parece muito importante, feliz por ler os comentários e obrigado @RichRemer. Nikki, acho que você deve editar isso em sua resposta, considerando quantas visualizações isso obtém. Veja aqui https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html e aqui Qual é a diferença entre os conjuntos de caracteres utf8mb4 e utf8 no MySQL? - Paulpro 12/03 at 17:46

Nikki Erwin Ramirez
fonte
4
Quais são as implicações de alterar o conjunto de caracteres padrão? Ele atualiza os dados existentes e, portanto, precisa percorrer a tabela e fazer atualizações, bloqueando-os etc.?
conceder
utf8_biné melhor, não é? Qual é a diferença entre utf8_bine utf8_unicode_ci?
Jasom Dotnet
1
Esse é apenas um exemplo que eu usei. A diferença é que diferencia utf8_binmaiúsculas de minúsculas e não diferencia utf8_unicode_cimaiúsculas de minúsculas. Um não é necessariamente melhor que o outro - use o que for mais adequado às suas necessidades.
Nikki Erwin Ramírez
12
@JasomDotnet agora você deve usar utf8mb4_unicode_ci stackoverflow.com/questions/766809/...
baptx
2
Deve evitar recomendar utf8. Quase nunca é o que você deseja e muitas vezes leva a bagunças inesperadas. O utf8conjunto de caracteres não é totalmente compatível com UTF-8. O utf8mb4conjunto de caracteres é o que você deseja se deseja UTF-8.
Rich Remer 28/03
34

O MySQL possui 4 níveis de agrupamento: servidor, banco de dados, tabela, coluna. Se você alterar o agrupamento do servidor, banco de dados ou tabela, não altera a configuração de cada coluna, mas altera os agrupamentos padrão.

Por exemplo, se você alterar o agrupamento padrão de um banco de dados, cada nova tabela que você criar nesse banco de dados usará esse agrupamento, e se você alterar o agrupamento padrão de uma tabela, cada coluna criada nessa tabela receberá esse agrupamento.

fredrik
fonte
8
De fato, o MySQL possui CINCO Níveis de ordenação, existe uma configuração de ordenação padrão no nível do conjunto de caracteres que muitas pessoas esquecem.
Devy
6
Há também agrupamento de conexões show variables like "collation%";, portanto total é SEIS .
Dzmitry Lazerka
9

Ele define o agrupamento padrão para a tabela; se você criar uma nova coluna, ela deverá ser intercalada com latin_general_ci - eu acho. Tente especificar o agrupamento para a coluna individual e veja se isso funciona. O MySQL tem um comportamento realmente bizarro em relação à maneira como lida com isso.

Don Werve
fonte
3

pode ser necessário alterar a tabela SCHEMA, não apenas

ALTER SCHEMA `<database name>`  DEFAULT CHARACTER SET utf8mb4  DEFAULT COLLATE utf8mb4_unicode_ci (as Rich said - utf8mb4);

(mariaDB 10)

AssyK
fonte
<database name>em vez de<table name>
dnivog 02/03/19
1
Veja meu comentário sobre a resposta aceita por que você não deveria recomendar utf8, mas utf8mb4.
Ricos Remer