2009-09-05 6 views
2

Question intéressante ... si j'ai une table MySQL avec CHARSET = utf8, et que j'ouvre une connexion avec l'encodage latin1, que se passe-t-il?Que se passe-t-il si je me connecte à une table de base de données MySQL utf8 en utilisant latin1?

J'ai essayé ceci, et même des caractères tels que ß et æ ont pu être stockés et récupérés correctement. Ces caractères sont représentés avec des séquences d'octets différentes dans utf8 et dans latin1, donc je ne m'attendais pas à ce qu'il fonctionne.

MySQL effectue-t-il une sorte de traduction à la volée entre les encodages de caractères?

Répondre

1

Oui, mysql effectue une conversion chrset, en fonction de la configuration. Pour modifier le chrset de votre connexion, vous pouvez utiliser SET NAMES comme

SET NAMES utf8; 
+0

Il dépend du réglage du default-character-set variable. Lorsque vous avez deux bases de données codées différentes (charsets différents) vous obtiendrez différents encodages de fichiers dans les dumps – astropanic

3

Vous vous sentirez comme cela fonctionne jusqu'à ce que vous vous connectez avec un autre jeu de caractères de connexion. Ensuite, vous verrez des caractères étranges et sûrement regretter.

Vous stockez des octets dans la base de données qui n'ont de sens que si vous les lisez avec la conversion utf8. Mais vous dites à mysql que le champ est latin, donc il ne comprendra pas, mais il vous les enverra de toute façon (vous êtes l'humain et il obéit). Comme vous êtes connecté avec utf8, vous allez les lire à travers ce jeu de caractères et les lire correctement.

Mais si les changements de connexion charset ou vous essayez de changer le charset du champ plus tard, vous serez en difficulté et auront besoin des trucs comme celui-ci pour lire un seul contenu du champ:

convert(cast(convert(FieldNameMessed using latin1) as binary) using utf8) 
Questions connexes