Quand utiliser utf-8 et quand utiliser latin1 dans MySQL?
Je sais que MySQL a défaut de latin1 encodage et apparemment, il prend 1 octet pour stocker un caractère dans latin1 et 3 octets pour stocker un caractère dans utf-8 - est-ce exact?
Je suis en train de travailler sur un site qui, je l'espère, sera utilisé dans le monde entier. Dois-je absolument besoin d'avoir utf-8? Ou vais-je être en mesure de s'en tirer avec l'aide de latin1?
Aussi, j'ai essayé de changer quelques tables à partir de latin1 à utf8 mais j'ai eu cette erreur:
Speficief key was too long; max key length is 1000 bytes
Quelqu'un sait-il la solution? Et dois-je vraiment le résoudre ou peut-latin1 être assez?
Grâce,
Alex
source d'informationauteur Genadinik
Vous devez vous connecter pour publier un commentaire.
Il faut
1
octets pour stocker unlatin1
caractère et1
à3
octets pour stocker unUTF8
caractère.Si vous utilisez uniquement le latin de base de caractères et de signes de ponctuation dans vos cordes (
0
à128
dansUnicode
), les deux jeux de caractères occupera de la même longueur.Si vous avez une colonne de
VARCHAR(334)
ou plus,MyISAM
pas l'habitude de vous permettre de créer un index sur elle depuis qu'il est à distance de possibilité de la colonne d'occuper plus que1000
octets.Notez que les touches de cette durée et ne sont que rarement utiles. Vous pouvez créer une préfixé index qui sera presque aussi sélectif pour toutes les données du monde réel.
À un strict minimum, je suggère l'utilisation de l'UTF-8. Vos données seront compatibles avec chaque autre base de données il y a de nos jours, depuis de 90% d'entre eux sont en UTF-8.
Si vous allez avec LATIN1/ISO-8859-1 vous risquez de données n'est pas correctement stockés, car il ne prend pas en charge les caractères internationaux... de sorte que vous pourriez courir dans quelque chose comme le côté gauche de cette image:
Si vous allez avec l'UTF-8, vous n'avez pas besoin de traiter avec ces maux de tête.
Au sujet de votre erreur, il semble que vous avez besoin pour optimiser votre base de données. Considérez ceci: http://bugs.mysql.com/bug.php?id=4541#c284415
Il serait utile si vous a donné spécificités sur votre schéma de table et de colonne pour cette question.
Si vous autorisez les utilisateurs à poster dans leur propre langue, et si vous souhaitez que les utilisateurs de tous les pays pour participer, vous devez passer au moins les tables contenant les postes de l'UTF-8 - Latin1 couvre uniquement l'ASCII d'europe occidentale et de caractères. La même chose est vraie si vous avez l'intention d'utiliser plusieurs langues pour votre INTERFACE utilisateur. Voir ce post pour savoir comment gérer la migration.
Dans mon expérience, si vous prévoyez de soutien en arabe, en russe, les langues Asiatiques ou autres, l'investissement dans le support UTF-8 d'avance sera payante en bas de la ligne. Toutefois, selon votre situation, vous pourriez être en mesure de s'en tirer avec l'anglais pendant un certain temps.
Comme pour l'erreur, vous avez probablement une clé ou d'un champ d'index avec plus de 333 caractères, le maximum permis dans MySQL avec l'encodage UTF-8. Voir ce rapport de bug.
Nous avons fait une demande à l'aide de Latin parce que c'était la valeur par défaut. Mais plus tard, nous avons dû tout changer pour de l'UTF parce que de l'espagnol caractères, pas incroyable, difficile mais aucun point d'avoir à changer les choses inutilement.
Si courte réponse est juste aller avec UTF-8 dès le début, cela vous fera gagner la difficulté plus tard.
Depuis le max de longueur de clé est de 1000 OCTETSsi vous utiliser de l'utf-8, alors ce sera limmit vous à 333 caractères.
Cependant MySQL est différente forme Oracle pour le jeu de caractères. Dans Oracle, vous ne pouvez pas avoir un autre jeu de caractères par colonne, wheras dans MySQL, vous pouvez, donc peut-être vous pouvez définir la clé de latin1 et d'autres colonnes de l'utf8.
Enfin, je crois seulement défunte version 6.0 alpha (abandonné quand le Soleil acheté MySQL) pourrait accueillir des caractères unicode beyound le BMP (Basic Multilingual Plan). Donc en gros, même avec de l'UTF-8, vous n'aurez pas tous les ensemble jeu de caractères unicode. Dans la pratique, c'est seulement un problème pour les rares caractères Chinois, si c'est vraiment important pour vous.
Je ne suis pas un expert, mais j'ai toujours compris que l'UTF-8 est en fait un 4-octet codage de jeu, pas de 3. Et comme je le comprends, la base de la mise en œuvre de utf8_unicode_ci ne gère que 3 octet encodage...
Si vous voulez profiter au maximum de l'UTF-8 de 4 octets codage de caractères, vous devez utiliser utf8mb4_unicode_ci codant pour votre base de données MySQL/tables.