# 1273 - Classement inconnu: 'utf8mb4_unicode_ci' cPanel

183

J'ai une base de données WordPress sur ma machine locale que je souhaite transférer vers un phpMyAdmin hébergé sur cPanel. Cependant, lorsque j'essaye d'importer la base de données dans l'environnement, j'obtiens toujours cette erreur:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

J'ai essayé de Google et la seule solution que je peux trouver est cette erreur phpmysql - # 1273 - # 1273 - Collation inconnue: 'utf8mb4_general_ci' qui, comme à présent, n'aide pas beaucoup. J'ai essayé d'effacer les cookies mais cela ne fonctionnera toujours pas. Veuillez aider!

Wairimu Murigi
la source
Quelle version de WordPress? Voir make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade
Rick James

Réponses:

107

J'ai eu le même problème car tous nos serveurs exécutent des versions plus anciennes de MySQL. Cela peut être résolu en exécutant un script PHP. Enregistrez ce code dans un fichier et exécutez-le en entrant le nom de la base de données, l'utilisateur et le mot de passe et cela changera le classement de utf8mb4/utf8mb4_unicode_ciàutf8/utf8_general_ci

<!DOCTYPE html>
<html>
<head>
  <title>DB-Convert</title>
  <style>
    body { font-family:"Courier New", Courier, monospace; }
  </style>
</head>
<body>

<h1>Convert your Database to utf8_general_ci!</h1>

<form action="db-convert.php" method="post">
  dbname: <input type="text" name="dbname"><br>
  dbuser: <input type="text" name="dbuser"><br>
  dbpass: <input type="text" name="dbpassword"><br>
  <input type="submit">
</form>

</body>
</html>
<?php
if ($_POST) {
  $dbname = $_POST['dbname'];
  $dbuser = $_POST['dbuser'];
  $dbpassword = $_POST['dbpassword'];

  $con = mysql_connect('localhost',$dbuser,$dbpassword);
  if(!$con) { echo "Cannot connect to the database ";die();}
  mysql_select_db($dbname);
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
          foreach ($tables as $key => $value) {
           mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
     }}
  echo "<script>alert('The collation of your database has been successfully changed!');</script>";
}

?>
Stephen
la source
47
Cela semble excessif vsmysqldump --compatible=mysql4
icc97
2
Pour moi, cela a fonctionné. N'oubliez pas de nommer le fichierdb-convert.php
Fred K
1
Si vous faites une entrée "localhost", c'est parfait.
br4nnigan
2
mysqldump --compatible=mysql4ou la réponse ci-dessous est une meilleure option. Je ne pense pas que ce soit une bonne idée de changer quelque chose comme ça sur un site en direct. Mieux vaut exporter dans le bon format, ou si ce n'est pas une option, éditez le fichier exporté.
Tisch
Donc vous venez de me sauver la vie, et tout ce que je peux vous donner est un +1.
Taruc
229

La technique de cet article a fonctionné pour moi

1) Cliquez sur l'onglet "Exporter" de la base de données

2) Cliquez sur le bouton radio "Personnalisé"

3) Allez dans la section intitulée "Options spécifiques au format" et modifiez la liste déroulante pour "Système de base de données ou ancien serveur MySQL pour maximiser la compatibilité de sortie avec:" de NONE à MYSQL40.

4) Faites défiler vers le bas et cliquez sur "GO".

Je ne suis pas sûr que cela entraîne une perte de données, mais la seule fois où je l'ai essayé, je n'en ai pas remarqué. Personne non plus n'a répondu dans les forums liés à ci-dessus.

Edit 8/12/16 - Je pense que l'exportation d'une base de données de cette manière me fait perdre des données enregistrées dans les widgets Black Studio TinyMCE Visual Editor , bien que je n'ai pas effectué plusieurs tests pour confirmer.

Evster
la source
n'a pas fonctionné pour moi, j'ai eu l'erreur # 1231 - La variable 'character_set_client' ne peut pas être définie sur la valeur de 'NULL'
nerdess
Après plusieurs tentatives infructueuses d'autres solutions, celle-ci a parfaitement fonctionné dès la première tentative.
Vincent Polisi
Ne fonctionne PAS avec certains nouveaux sites Wordpress. Lors de son importation sur l'autre serveur, il génère cette erreur sur la toute première table qu'il tente d'importer (wp_commentmeta) # 1064 - Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'TYPE = MyISAM AUTO_INCREMENT = 1' à la ligne 19
that-ben
cela ne semble pas faire de différence pour moi, toujours les mêmes messages d'erreur
pealo86
vous êtes le patron
Aseel Ashraf
159

Si vous avez déjà exporté un .sqlfichier, la meilleure chose à faire est de rechercher et de remplacer les éléments suivants si vous les avez dans votre fichier:

  • utf8mb4_0900_ai_ci à utf8_unicode_ci
  • utf8mb4 à utf8
  • utf8_unicode_520_ci à utf8_unicode_ci

Il remplacera utf8mb4_unicode_cià utf8_unicode_ci. Maintenant , vous allez à votre phpMyAdmin cPanel et définissez le classement DB à utf8_unicode_citravers des opérations> Collation .

Si vous exportez vers un .sql, il est préférable de changer le format de la façon dont vous exportez le fichier. Consultez la réponse d'Evster (c'est dans la même page que celle-ci)

Rangel R. Morais
la source
2
cela fonctionne parfaitement avec celui-ci stackoverflow.com/a/30694416/1022726
iurii
Pour tous les gens unix: sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Cela trouvera toutes les occurrences de utf8mb4dans FILE_NAME et les remplacera par utf8lors de l'enregistrement d'une copie du fichier d'origine dans FILE_NAME.bak. Vous devrez peut-être le modifier pour spécifier la coalition exacte dans votre cas, mais c'est un début :)
DaveLak
1
J'ai aussi dû remplacer: utf8_unicode_520_ci par: utf8_unicode_ci
Nick Rivers
Ou via vi: vi dump.sqlpuis via le faire: :%s/uf8mb4/utf8/g.
Valentin Grégoire
2
et remplacer utf8_0900_ai_ciparutf8_unicode_ci
Irfan Yusanif
44

j'utilise ceci sous linux:

sed -i 's/utf8mb4/utf8/g' your_file.sql
sed -i 's/utf8_unicode_ci/utf8_general_ci/g' your_file.sql
sed -i 's/utf8_unicode_520_ci/utf8_general_ci/g' your_file.sql

puis restaurez votre_fichier.sql

mysql -u yourdBUser -p yourdBPasswd yourdB < your_file.sql
halilintar8
la source
1
Il y a un commentaire sur une autre réponse, qu'il vaut la peine de répéter ici. La version OS X de sed nécessite un argument supplémentaire après l'indicateur -i. Alors ça sed -i '' ....marche.
Kent
2
Je devais aussi exécuter ceci:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays
28

Wordpress 4.2 a introduit la prise en charge du codage de caractères "utf8mb4" pour des raisons de sécurité , mais seul MySQL 5.5.3 et supérieur le prend en charge. La façon dont le programme d'installation (et le programme de mise à jour) gère cela est de vérifier votre version de MySQL et votre base de données ne sera mise à niveau vers utfmb4 que si elle est prise en charge .

Cela semble très bien en théorie, mais le problème (comme vous l'avez découvert) est lorsque vous migrez des bases de données d'un serveur MySQL qui prend en charge utf8mb4 vers un autre qui ne le fait pas. Bien que l'inverse devrait fonctionner, il s'agit essentiellement d'une opération à sens unique.

Comme indiqué par Evster, vous pourriez avoir du succès en utilisant la fonction "Exporter" de PHPMYAdmin. Utilisez " Méthode d'exportation: Personnalisée " et pour le " Système de base de données ou un ancien serveur MySQL pour maximiser la compatibilité de sortie avec: " sélectionnez dans la liste déroulante " MYSQL 40 ".

Pour un export en ligne de commande à l'aide de mysqldump. Jetez un œil au drapeau:

$ mysqldump --compatible=mysql4

Remarque: S'il y a des caractères de 4 octets dans la base de données, ils seront corrompus.

Enfin, pour quiconque utilise le populaire plugin WP Migrate DB PRO, un utilisateur de ce fil de discussion Wordpress.org rapporte que la migration est toujours gérée correctement, mais je n'ai rien trouvé d'officiel.

Le plugin WP Migrate DB traduit la base de données d'un classement à l'autre lorsqu'il déplace des sites 4.2 entre des hôtes avec MySQL pré ou post-5.5.3

Pour le moment, il ne semble pas y avoir de moyen de désactiver la mise à jour de la base de données. Donc, si vous utilisez un flux de travail dans lequel vous migrez un site d'un serveur ou d'un hôte local avec MySQL> 5.5.3 vers un site qui utilise une version plus ancienne de MySQL, vous n'aurez peut-être pas de chance.

Mark Thomson
la source
Changer la compatibilité en "MYSQL 40" a totalement fonctionné pour moi.
Keryn Gill le
3
Si vous essayez ensuite d'importer le vidage compatible mysql4 dans une base de données post v5.5.3 (j'utilise 5.5.28), cela échoue car le script inclut TYPE=MyISAMqui a été supprimé dans la v5.1. Effectuez une recherche et remplacez par ENGINE=MyISAM. Je ne pouvais pas voir un moyen de contourner cela en utilisant les mysqldumpoptions de sortie.
icc97
26

Dans mon cas, il s'avère que mon
nouveau serveur fonctionnait MySQL 5.5, l'
ancien serveur fonctionnait MySQL 5.6.
J'ai donc eu cette erreur en essayant d'importer le.sql fichier que j'avais exporté depuis mon ancien serveur.

MySQL 5.5 ne prend pas en charge utf8mb4_unicode_520_ci, mais
MySQL 5.6 le fait.

La mise à jour MySQL 5.6sur le nouveau serveur a résolu le classement de l'erreur!

Si vous souhaitez conserver MySQL 5.5, vous pouvez:
- faire une copie de votre .sqlfichier exporté
- remplacer les instances de utf8mb4unicode520_ciet utf8mb4_unicode_520_ci
... par utf8mb4_unicode_ci
- importer votre .sqlfichier mis à jour .

SherylHohman
la source
1
Oui - le téléchargement vers 5.6 est la solution la plus simple pour cela (et Ubuntu a un mysql-server-5.6package que vous pouvez installer qui supprimera la version 5.5 automatiquement).
William Turrell
15

Il y a une ligne dans wp-config.php:

define('DB_CHARSET', 'utf8mb4');

Si vous suivez les instructions de Markouver / Evster , n'oubliez pas de changer cette ligne sur le serveur de production en

define('DB_CHARSET', 'utf8');

afin de corriger les caractères brisés de 4 octets

Isk1n
la source
1
N'oubliez pas non plus de modifier define('DB_COLLATE', 'utf8_general_ci');. Cela m'a aidé.
Abduhafiz
10

Après de longues recherches, j'ai trouvé la solution ci-dessus:

  1. Tout d'abord, vous changez la valeur par défaut de wp-config.php> Database DB_CHARSET en "utf8"

  2. Cliquez sur l'onglet "Exporter" de la base de données

  3. Cliquez sur le bouton radio "Personnalisé"

  4. Allez dans la section intitulée "Options spécifiques au format" et modifiez la liste déroulante pour "Système de base de données ou ancien serveur MySQL pour maximiser la compatibilité de sortie avec:" de NONE à MYSQL40.

  5. Faites défiler vers le bas et cliquez sur OK

Alors vous êtes sur.

Dead Boyz
la source
7

On dirait que votre hôte ne fournit pas de version MySQL capable d'exécuter des tables avec le classement utf8mb4.

Les tables WordPress ont été changées en utf8mb4 avec la version 4.2 (publiée le 23 avril 2015) pour prendre en charge Emojis, mais vous avez besoin de MySQL 5.5.3 pour l'utiliser.5.5.3. date de mars 2010, il devrait donc normalement être largement disponible. Cna vous vérifiez si votre hébergeur fournit cette version?

Sinon, et une mise à niveau n'est pas possible, vous devrez peut-être rechercher un autre hébergeur pour exécuter les dernières versions de WordPress (et vous devez toujours le faire pour des raisons de sécurité).

flomei
la source
1
Vous pouvez vérifier votre version de MySQL via la ligne de commande avec "mysql -V"
Edd Smith
2

J'ai donc résolu de cette manière, de MySQL 5.6 à MySQL 5.5:

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql
$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

(Facultatif) Créez un .sql.gzfichier:

$ gzip database_name.sql 

Explication

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql

Comme expliqué dans cette réponse , ceci est juste l'équivalent de ces options de phpMyAdmin: "Système de base de données ou ancien serveur MySQL pour maximiser la compatibilité de sortie avec:" menu déroulant "MYSQL 40" .

$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

Nous avons besoin de ceci, pour résoudre ce problème:

ERREUR 1064 (42000) à la ligne 18: vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'TYPE = InnoDB' à la ligne 9

Andrea
la source
1
Notez que si vous utilisez la version OS X de Sed: $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. Si vous souhaitez conserver une copie comme database_name.sql.bakavant le remplacement de sed:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier
vous pouvez également en ligne sed.
davidbitton le
De plus, si vous exécutez mysqldump sur MySQL 8, vous devez utiliser l' --compatible=ansioption
AbstractVoid
1

J'ai également rencontré ce problème. La solution qui a fonctionné pour moi était d'ouvrir la base de données locale avec Sequel Pro et de mettre à jour l' encodage et le classement en utf8 / utf8_bin pour chaque table avant l'importation.

Damian Walsh
la source
1

Le moyen le plus simple de le faire est d'exporter votre base de données vers .sql, de l'ouvrir sur Notepad ++ et de "Rechercher et remplacer" le utf8mb4_unicode_civers utf8_unicode_ciet également de remplacer utf8mb4vers utf8. N'oubliez pas non plus de changer le classement de la base de données en utf8_unicode_ci(Opérations> Collation).

Brane
la source
0

ouvrez le fichier sql sur Notepad ++ et ctrl + H. ensuite vous mettez " utf8mb4" sur la recherche et " utf8" sur le remplacement. Le problème sera alors résolu.

John
la source
Il dit "unknown collation utf8"
Cristian Traìna