¿Cómo cambiar la clasificación predeterminada de una tabla?

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

crea una tabla con la clasificación predeterminada latin1_general_ci;

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

muestra la clasificación individual de las columnas como 'latin1_general_ci'.

Entonces, ¿cuál es el efecto del comando alter table?

simplfuzz
fuente
posible duplicado de la clasificación de la base
Michel Ayres
Es posible que desee alterar la respuesta correcta ya que yo y muchos otros parecemos estar de acuerdo en que la segunda es la correcta.
Ahi Tuna

Respuestas:

597

Para cambiar el conjunto de caracteres predeterminado y la clasificación de una tabla, incluidos los de las columnas existentes (tenga en cuenta la cláusula de conversión a ):

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

Editó la respuesta, gracias a la aparición de algunos comentarios:

Debe evitar recomendar utf8. Casi nunca es lo que quieres, y a menudo conduce a problemas inesperados. El juego de caracteres utf8 no es totalmente compatible con UTF-8. El conjunto de caracteres utf8mb4 es lo que desea si desea UTF-8. - Rich Remer 28 de marzo de 18 a las 23:41

y

Eso parece bastante importante, me alegro de haber leído los comentarios y gracias @RichRemer. Nikki, creo que deberías editar eso en tu respuesta teniendo en cuenta cuántas vistas tiene esto. Vea aquí https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html y aquí ¿Cuál es la diferencia entre los conjuntos de utf8mb4 y utf8 en MySQL? - Paulpro 12 de marzo a las 17:46

Nikki Erwin Ramirez
fuente
44
¿Cuáles son las implicaciones de cambiar el conjunto de caracteres predeterminado? ¿Actualiza los datos existentes y, por lo tanto, necesita ejecutar la tabla y realizar actualizaciones, bloquearla, etc.?
conceder el
utf8_bines mejor, no? ¿Cuál es la diferencia entre utf8_biny utf8_unicode_ci?
Jasom Dotnet
1
Ese es solo un ejemplo que utilicé. La diferencia es que utf8_bines sensible a utf8_unicode_cimayúsculas y minúsculas. Uno no es necesariamente mejor que el otro: use lo que se adapte a sus necesidades.
Nikki Erwin Ramirez
12
@JasomDotnet ahora debe usar utf8mb4_unicode_ci stackoverflow.com/questions/766809/…
baptx
2
Debe evitar recomendar utf8. Casi nunca es lo que quieres, y a menudo conduce a problemas inesperados. El utf8juego de caracteres no es totalmente compatible con UTF-8. El utf8mb4conjunto de caracteres es lo que desea si desea UTF-8.
Rich Remer
34

MySQL tiene 4 niveles de intercalación: servidor, base de datos, tabla, columna. Si cambia la clasificación del servidor, la base de datos o la tabla, no cambia la configuración de cada columna, pero cambia las clasificaciones predeterminadas.

Por ejemplo, si cambia la clasificación predeterminada de una base de datos, cada nueva tabla que cree en esa base de datos usará esa clasificación, y si cambia la clasificación predeterminada de una tabla, cada columna que cree en esa tabla obtendrá esa clasificación.

fredrik
fuente
8
De hecho, MySQL tiene CINCO niveles de intercalación, hay una configuración de intercalación predeterminada de nivel de juego de caracteres que muchas personas olvidan.
Devy
66
También hay intercalación de conexiones show variables like "collation%";, por lo que el total es SEIS .
Dzmitry Lazerka
9

Establece la clasificación predeterminada para la tabla; si crea una nueva columna, eso debería clasificarse con latin_general_ci, creo. Intente especificar la clasificación para la columna individual y vea si eso funciona. MySQL tiene un comportamiento realmente extraño con respecto a la forma en que maneja esto.

Don Werve
fuente
3

puede necesitar cambiar la tabla SCHEMA no solo

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

(mariaDB 10)

AssyK
fuente
<database name>en lugar de<table name>
dnivog
1
Vea mi comentario sobre la respuesta aceptada por qué no debería recomendar utf8, pero utf8mb4.
Rich Remer