charset Dois-je migrer une base de données MySQL avec un classement latin1_swedish_ci vers utf-8 et, si oui, comment?




mysql set charset utf 8 (4)

La base de données MySQL utilisée par mon application Rails a actuellement le classement par défaut de latin1_swedish_ci . Comme le jeu de caractères par défaut des applications Rails (y compris le mien) est UTF-8, il me semble judicieux d'utiliser le collationnement utf8_general_ci dans la base de données.

Est-ce que ma pensée est correcte?

En supposant que ce soit le cas, quelle serait la meilleure approche pour migrer le classement et toutes les données de la base de données vers le nouvel encodage?


Answer #1

UTF-8, ainsi que tout autre système de codage Unicode, peut stocker des caractères dans n'importe quelle langue, c'est donc un excellent choix de page de code pour votre base de données.

Le paramètre de collation, en revanche, est un problème complètement distinct du schéma de codage. Il s'agit d'ordres de tri, de conversions majuscules / minuscules, de comparaisons d'égalité de chaînes et d'autres éléments spécifiques à la langue. Le paramètre de classement doit correspondre à la langue utilisée dans la base de données.

Le classement général UTF-8 est (je suppose ici - je ne suis pas familier avec MySQL en particulier) utilisé pour les situations où la langue est inconnue et une simple commande par défaut est nécessaire. Cela correspond probablement à l'ordre des points de code Unicode, qui n'est certainement pas ce que vous voulez si vous stockez du suédois.


Answer #2

La fourniture de vos données existantes dans la base de données est CORRECTEMENT encodée dans latin1, la conversion des tables en utf8 (en utilisant ALTER TABLE, comme décrit dans les docs) devrait fonctionner.

Ensuite, tout ce que votre application doit faire est de continuer à faire ce qu'elle a déjà fait. Si votre application souhaite utiliser des caractères Unicode, elle doit définir son encodage de connexion sur utf8 et utiliser utf8, mais c'est son propre problème.

Le problème est qu'un grand nombre d'applications Web de la merde ont historiquement envoyé des données utf8 à mysql et lui a dit de le traiter comme latin1. MySQL l'honorera parfaitement et sauvera la malbouffe dans les tables, comme indiqué.

La conversion des tables de latin1 en utf8 ne résoudra PAS cette erreur, car vous avez vraiment des déchets. Leur réparation est non triviale, en particulier si pendant la durée de vie de l'application, il a été question de différents types d'ordures à la base de données.


Answer #3

Convertir en UTF-8 en tant que jeu de caractères.

Les paramètres de classement ne sont utilisés que pour le tri et ce genre de choses. Choisissez le classement auquel la plupart de vos utilisateurs s'attendraient.


Answer #4

Utilisez ci-dessous la requête mysql pour convertir votre colonne:

ALTER TABLE users MODIFY description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Pour voir tous les détails de votre table:

SHOW FULL COLUMNS FROM users;




character-encoding