2017-10-05 5 views
0

J'ai un problème étrange avec MySql supportant l'alphabet cyrilique. La base de données a été créée dans utf8_unicode_ci depuis le début, mais les tables ne l'étaient pas. En ce moment les données de la table, si fourni en cyrrilic ressemble à ceci ????????, si je crée une table depuis le début dans utf il n'y a pas de problème, cependant si j'essaye de changer l'encodage de table existant en utilisantMySQL Database change la table existante en UTF8

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

qui est censé modifier les données existantes ou

ALTER TABLE Strategies 
    CHARACTER SET utf8, 
    COLLATE utf8_unicode_ci; 

qui est censé modifier les données futures, cela ne fonctionne pas.

je aussi changer my.cnf fichier et ajouté dans

[mysqld] 
# 
#default-character-set=utf8 this one breaks mysql restart 
character-set-server=utf8 
skip-character-set-client-handshake 
collation-server=utf8_unicode_ci 
init-connect='SET NAMES utf8' 
init_connect='SET collation_connection = utf8_general_ci' 

Si je cours SHOW VARIABLES OÙ VARIABLE_NAME LIKE '% character_set_' OU VARIABLE_NAME LIKE '% collation'; Je reçois:

enter image description here

Je change aussi utf directement en PHP mon admin et il montre en fait que la table est en utf mais rien ne se passe à l'existant ????????? ou aux futures entrées cyrilliques.

Espérons que quelqu'un d'autre avait expérimenté ce genre de problème, serait vraiment formidable pour toute aide ou suggestion. Je vous remercie.

+0

Qu'est-ce que vous obtenez pour ... SELECT CHARACTER_SET_NAME, COLLATION_NAME from information_schema.colonnes où table_schema = '' et table_name = ''. ? –

+0

Quel était le codage * original * des tables/colonnes en question? – Binarus

+0

Il était latin1_swedish_ci –

Répondre

0

Si une table commence comme latin1 et a des caractères latin1 codés dans, utilisez ALTER TABLE ... CONVERT TO CHARACTER SET utf8 (comme vous l'avez fait)

Avant de convertir, tester l'ancien encodage faire deux choses:

SHOW CREATE TABLE ... -- to see that the columns say latin1 
SELECT HEX(col) ... -- to see what the encoding looks like: é should show E9 

Je dis, "avant" parce qu'il est possible de fourrer utf8 en latin1 incorrectement. é devrait montrer C3A9 - c'est "double-encodage".

faire de même après la conversion:

SHOW CREATE TABLE ... -- to see that the columns say utf8 
SELECT HEX(col) ... -- to see what the encoding looks like; é should show C3A9 

C383C2A9 indiquerait double codage. Un gâchis.

Ne pas dépendre de init-connect='SET NAMES utf8' si vous vous connectez comme root, init-connect est ignoré pour root et tout autre utilisateur SUPER.

Mais ... Vous dites que vous mettez du texte cyrillique dans une colonne latin1? C'est "impossible" puisque latin1 ne peut représenter autre chose que des caractères latins d'Europe occidentale. Alors ... Vous avez probablement "double-encodage".

Pour plus de débogage, voir Trouble with utf8. Notez en particulier "point d'interrogation".

Pour réparer le double-codage, voir Fixes et sélectionnez le cas échéant. Ce lien dit aussi ce que vous aurait fait (l'Alter en 2 étapes) au lieu de ce que vous avez fait.