# 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!


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>";
}

?>

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.


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)


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

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.


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 .


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


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.


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é).


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


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

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).


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.


Il dit "unknown collation utf8"
Cristian Traìna
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.