web-dev-qa-db-fra.com

MySQL - Convertir les caractères latin1 d'une table UTF8 en UTF8

Aujourd'hui seulement, j'ai réalisé que je manquais cela dans mes scripts PHP:

mysql_set_charset('utf8');

Toutes mes tables sont InnoDB, le classement "utf8_unicode_ci" et toutes mes colonnes VARCHAR sont également "utf8_unicode_ci". J'ai mb_internal_encoding('UTF-8'); sur mes scripts PHP, et tous mes fichiers PHP sont encodés en UTF-8).

Donc, jusqu'à présent, chaque fois que j'insère quelque chose avec des signes diacritiques, par exemple:

mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"');

Le contenu du 'nom' serait, dans ce cas: Jáuò Iñe.

Depuis que j'ai corrigé le jeu de caractères entre PHP et MySQL, les nouveaux INSERT sont maintenant stockés correctement. Cependant, je veux corriger toutes les anciennes lignes qui sont "gâchées" en ce moment. J'ai déjà essayé beaucoup de choses , mais il casse toujours les chaînes du premier caractère "illégal". Voici mon code actuel:

$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP &aacute; (á)ţăriîş </b>"; ?> ă-ţi abcdd;//;ñç´พดแทฝใจคçăâξβψδπλξξςαยนñ ;');
mysql_set_charset('utf8');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('latin1');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('utf8');

$result = mysql_iquery('SELECT * FROM `table`');
while ($row = mysql_fetch_assoc($result)) {
    $message = $row['name'];
    $message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8');
    //$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message);
    mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"');
}

Il "UPDATE" contient les caractères attendus, sauf que la chaîne est tronquée après le caractère "ă". Je veux dire, ce caractère et les caractères suivants ne sont pas inclus dans la chaîne.

De plus, tester avec "iconv ()" (qui est commenté sur le code) fait de même, même avec // IGNORE et // TRANSLIT

J'ai également testé plusieurs jeux de caractères, entre ISO-8859-1 et ISO-8859-15.

J'ai vraiment besoin d'aide ici! Merci.

43
Nuno

D'après ce que vous décrivez, il semble que vous ayez des données UTF-8 qui ont été initialement stockées en Latin-1 et qui n'ont pas ensuite été converties correctement en UTF-8. Les données sont récupérables; vous aurez besoin d'une fonction MySQL comme

convert(cast(convert(name using  latin1) as binary) using utf8)

Il est possible que vous deviez omettre la conversion interne, selon la façon dont les données ont été modifiées lors de la conversion d'encodage.

115
ABS

Après avoir cherché environ une heure ou deux pour cette réponse. J'avais besoin de migrer une ancienne base de données tt_news de typo vers une nouvelle version typo3. J'ai déjà essayé de convertir le jeu de caractères dans le fichier d'exportation et de l'importer, mais je ne l'ai pas fait fonctionner.

Ensuite, j'ai essayé la réponse ci-dessus d'ABS et commencé une mise à jour sur la table:

UPDATE tt_news SET 
    title=convert(cast(convert(title using  latin1) as binary) using utf8), 
    short=convert(cast(convert(short using  latin1) as binary) using utf8), 
    bodytext=convert(cast(convert(bodytext using  latin1) as binary) using utf8)
WHERE 1

Vous pouvez également convertir imagecaption, imagealttext, imagetitletext et des mots clés si nécessaire. J'espère que cela aidera quelqu'un à migrer tt_news vers une nouvelle version de typo3.

25
Marcel Grolms

le moyen est meilleur moyen d'utiliser la connexion pour remorquer votre base de données normale

puis utilisez ce code pour faire ce dont vous avez besoin vous devez faire votre page encodant utf-8 par meta en en-tête cod html (n'oubliez pas cela)

puis utilisez ce code

    $result = mysql_query('SELECT * FROM shops');
    while ($row = mysql_fetch_assoc($ 
    $name= iconv("windows-1256", "UTF-8", $row['name']);

   mysql_query("SET NAMES 'utf8'"); 
   mysql_query("update   `shops` SET `name`='".$name."'  where ID='$row[ID]'  ");
    }
0
hussien