Comment changer le classement par défaut d'une table?

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

crée une table avec le classement par défaut latin1_general_ci;

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

affiche le classement individuel des colonnes sous la forme «latin1_general_ci».

Alors quel est l'effet de la commande alter table?

simplfuzz
la source
doublon possible du classement de la base de données
Michel Ayres
Vous voudrez peut-être modifier la bonne réponse car moi-même et beaucoup d'autres semblent convenir que la deuxième est la bonne.
Ahi Tuna

Réponses:

597

Pour modifier le jeu de caractères par défaut et le classement d'un tableau, y compris ceux des colonnes existantes (notez la clause convert to ):

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

Modification de la réponse, grâce à l'invitation de quelques commentaires:

Devrait éviter de recommander utf8. Ce n'est presque jamais ce que vous voulez et conduit souvent à des dégâts inattendus. Le jeu de caractères utf8 n'est pas entièrement compatible avec UTF-8. Le jeu de caractères utf8mb4 est ce que vous voulez si vous voulez UTF-8. - Rich Remer 28 mars 18 à 23:41

et

Cela semble assez important, heureux d'avoir lu les commentaires et merci @RichRemer. Nikki, je pense que vous devriez modifier cela dans votre réponse en tenant compte du nombre de vues que cela génère. Voir ici https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html et ici Quelle est la différence entre les jeux de caractères utf8mb4 et utf8 dans MySQL? - Paulpro 12 mars à 17:46

Nikki Erwin Ramirez
la source
4
Quelles sont les implications de la modification du jeu de caractères par défaut? Met-il à jour les données existantes et doit donc parcourir la table et effectuer des mises à jour, le verrouiller, etc.
octroi du
utf8_binc'est mieux, n'est-ce pas? Quelle est la différence entre utf8_binet utf8_unicode_ci?
Jasom Dotnet
1
C'est juste un exemple que j'ai utilisé. La différence est qu'il utf8_binest sensible à la casse et utf8_unicode_cin'est pas sensible à la casse. L'un n'est pas nécessairement meilleur que l'autre - utilisez ce qui répond à vos besoins.
Nikki Erwin Ramirez le
12
@JasomDotnet vous devriez maintenant utiliser utf8mb4_unicode_ci stackoverflow.com/questions/766809/…
baptx
2
Devrait éviter de recommander utf8. Ce n'est presque jamais ce que vous voulez et conduit souvent à des dégâts inattendus. Le utf8jeu de caractères n'est pas entièrement compatible avec UTF-8. Le utf8mb4jeu de caractères est ce que vous voulez si vous voulez UTF-8.
Rich Remer
34

MySQL a 4 niveaux de classement: serveur, base de données, table, colonne. Si vous modifiez le classement du serveur, de la base de données ou de la table, vous ne modifiez pas le paramètre de chaque colonne, mais vous modifiez les classements par défaut.

Par exemple, si vous modifiez le classement par défaut d'une base de données, chaque nouvelle table que vous créez dans cette base de données utilisera ce classement, et si vous modifiez le classement par défaut d'une table, chaque colonne que vous créez dans cette table obtiendra ce classement.

Fredrik
la source
8
En fait, MySQL a CINQ niveaux de classement, il existe un paramètre de classement par défaut au niveau du jeu de caractères que beaucoup de gens oublient.
Devy
6
Il y a aussi le classement des connexions show variables like "collation%";, donc le total est SIX .
Dzmitry Lazerka
9

Il définit le classement par défaut de la table; si vous créez une nouvelle colonne, qui devrait être collée avec latin_general_ci - je pense. Essayez de spécifier le classement pour la colonne individuelle et voyez si cela fonctionne. MySQL a un comportement vraiment bizarre en ce qui concerne la façon dont il gère cela.

Don Werve
la source
3

peut avoir besoin de changer le SCHEMA non seulement la table

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

(mariaDB 10)

AssyK
la source
<database name>au lieu de<table name>
dnivog
1
Voir mon commentaire sur la réponse acceptée pourquoi vous ne devriez pas recommander utf8, mais utf8mb4.
Rich Remer