# 1273 - Cotejo desconocido: 'utf8mb4_unicode_ci' cPanel

183

Tengo una base de datos de WordPress en mi máquina local que quiero transferir a un phpMyAdmin alojado en cPanel. Sin embargo, cuando intento importar la base de datos al entorno, sigo recibiendo este error:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

He intentado buscar en Google y la única solución que puedo encontrar es este error phpmysql - # 1273 - # 1273 - Clasificación desconocida: 'utf8mb4_general_ci' que, por ahora, no es de mucha ayuda. He intentado borrar las cookies pero todavía no funciona. ¡Por favor ayuda!

Wairimu Murigi
fuente
¿Qué versión de WordPress? Ver make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade
Rick James el

Respuestas:

107

Tuve el mismo problema ya que todos nuestros servidores ejecutan versiones anteriores de MySQL. Esto se puede resolver ejecutando un script PHP. Guarde este código en un archivo y ejecútelo ingresando el nombre de la base de datos, el usuario y la contraseña y cambiará la clasificación de utf8mb4/utf8mb4_unicode_ciautf8/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
fuente
47
Esto parece excesivo vsmysqldump --compatible=mysql4
icc97
2
Para mí funcionó. Recuerde nombrar el archivodb-convert.php
Fred K
1
Si haces que 'localhost' sea una entrada, es perfecto.
br4nnigan
2
mysqldump --compatible=mysql4o la respuesta a continuación es una mejor opción. No creo que sea una buena idea cambiar algo como esto en un sitio en vivo. Es mejor exportar en el formato correcto, o si esa no es una opción, edite el archivo exportado.
Tisch
Así que me salvaste la vida y todo lo que puedo darte es un +1.
Taruc
229

La técnica en esta publicación funcionó para mí

1) Haga clic en la pestaña "Exportar" para la base de datos

2) Haga clic en el botón de opción "Personalizado"

3) Vaya a la sección titulada "Opciones específicas de formato" y cambie el menú desplegable "Sistema de base de datos o servidor MySQL anterior para maximizar la compatibilidad de salida con:" de NINGUNO a MYSQL40.

4) Desplácese hasta la parte inferior y haga clic en "IR".

No estoy seguro de si hacer esto causa alguna pérdida de datos, sin embargo, una vez que lo intenté no noté ninguno. Tampoco nadie que respondió en los foros vinculados anteriormente.

Editar 8/12/16 : creo que exportar una base de datos de esta manera me hace perder los datos guardados en los widgets de Black Studio TinyMCE Visual Editor , aunque no he realizado varias pruebas para confirmar.

Evster
fuente
no funcionó para mí, recibí el error # 1231 - La variable 'character_set_client' no se puede establecer en el valor de 'NULL'
nerdess
Después de múltiples intentos fallidos en otras soluciones, esta funcionó perfectamente en el primer intento.
Vincent Polisi
NO funciona con algunos sitios nuevos de Wordpress. Al importarlo en el otro servidor, genera este error en la primera tabla que intenta importar (wp_commentmeta) # 1064: tiene un error en la sintaxis de SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de 'TYPE = MyISAM AUTO_INCREMENT = 1' en la línea 19
ese es el
esto no pareció hacer ninguna diferencia para mí, todavía recibía los mismos mensajes de error
pealo86
usted es el jefe
Aseel Ashraf
159

Si ya ha exportado un .sqlarchivo, lo mejor que puede hacer es buscar y reemplazar lo siguiente si los tiene en su archivo:

  • utf8mb4_0900_ai_ci a utf8_unicode_ci
  • utf8mb4 a utf8
  • utf8_unicode_520_ci a utf8_unicode_ci

Reemplazará utf8mb4_unicode_cia utf8_unicode_ci. Ahora vaya a su cPanel phpMyAdmin y configure la intercalación de DB a utf8_unicode_citravés de Operaciones> Intercalación .

Si está exportando a .sql, es mejor cambiar el formato de cómo está exportando el archivo. Echa un vistazo a la respuesta de Evster (está en la misma página que esta)

Rangel R. Morais
fuente
2
funciona perfectamente junto con este stackoverflow.com/a/30694416/1022726
iurii
Para todos ustedes, la gente de Unix: sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Esto encontrará todas las apariciones utf8mb4en FILE_NAME y lo reemplazará utf8mientras guarda una copia del archivo original en FILE_NAME.bak. Es posible que deba ajustarlo para especificar la coalición exacta en su caso, pero esto es un comienzo :)
DaveLak
1
También tuve que reemplazar: utf8_unicode_520_ci con: utf8_unicode_ci
Nick Rivers el
O vía VI: vi dump.sqly luego en medio de hacer esto: :%s/uf8mb4/utf8/g.
Valentin Grégoire
2
y reemplazar utf8_0900_ai_ciconutf8_unicode_ci
Irfan Yusanif
44

Yo uso esto en 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

luego restaure your_file.sql

mysql -u yourdBUser -p yourdBPasswd yourdB < your_file.sql
halilintar8
fuente
1
Hay un comentario sobre otra respuesta, que vale la pena repetir aquí. La versión OS X de sed requiere un argumento adicional después del indicador -i. Así sed -i '' ....funciona
Kent
2
También tuve que ejecutar esto:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays
28

Wordpress 4.2 introdujo el soporte para la codificación de caracteres "utf8mb4" por razones de seguridad , pero solo MySQL 5.5.3 y mayores lo admiten. La forma en que el instalador (y el actualizador) maneja esto es que comprueba su versión de MySQL y su base de datos se actualizará a utfmb4 solo si es compatible .

Esto suena muy bien en teoría, pero el problema (como has descubierto) es cuando estás migrando bases de datos de un servidor MySQL que admite utf8mb4 a uno que no lo hace. Si bien al revés debería funcionar, es básicamente una operación unidireccional.

Como señaló Evster, es posible que tenga éxito con la función "Exportar" de PHPMYAdmin. Use " Método de exportación: personalizado " y para el " Sistema de base de datos o servidor MySQL anterior para maximizar la compatibilidad de salida con: " seleccione " MYSQL 40 " desplegable .

Para una exportación de línea de comando usando mysqldump. Echa un vistazo a la bandera:

$ mysqldump --compatible=mysql4

Nota: Si hay caracteres de 4 bytes en la base de datos, se dañarán.

Por último, para cualquiera que use el popular complemento WP Migrate DB PRO, un usuario en este hilo de Wordpress.org informa que la migración siempre se maneja correctamente, pero no pude encontrar nada oficial.

El complemento WP Migrate DB traduce la base de datos de una intercalación a otra cuando mueve 4.2 sitios entre hosts con MySQL pre o post 5.5.3

En este momento, no parece haber una forma de cancelar la actualización de la base de datos. Entonces, si está utilizando un flujo de trabajo en el que está migrando un sitio desde un servidor o localhost con MySQL> 5.5.3 a uno que usa una versión anterior de MySQL, es posible que no tenga suerte.

Mark Thomson
fuente
Cambiar la compatibilidad a "MYSQL 40" funcionó totalmente para mí.
Keryn Gill
3
Si luego intenta importar el volcado compatible con mysql4 en una base de datos posterior a la versión v5.5.3 (estoy usando 5.5.28), entonces falla porque el script incluye TYPE=MyISAMque se eliminó en la v5.1. Haga una búsqueda y reemplace con ENGINE=MyISAM. No pude evitar esto usando las mysqldumpopciones de salida.
icc97
26

En mi caso, mi
nuevo servidor se estaba ejecutando MySQL 5.5, el
antiguo servidor se estaba ejecutando MySQL 5.6.
Así que recibí este error al intentar importar el .sqlarchivo que había exportado desde mi antiguo servidor.

MySQL 5.5 no es compatible utf8mb4_unicode_520_ci, pero
MySQL 5.6 sí.

¡La actualización MySQL 5.6en el nuevo servidor resolvió la intercalación del error!

Si desea conservar MySQL 5.5, puede:
- hacer una copia de su .sqlarchivo exportado
- reemplazar instancias de utf8mb4unicode520_ciy utf8mb4_unicode_520_ci
... con utf8mb4_unicode_ci
- importar su .sqlarchivo actualizado .

SherylHohman
fuente
1
Sí, subir a 5.6 es la solución más simple para esto (y Ubuntu tiene un mysql-server-5.6paquete que puede instalar que eliminará 5.5 automáticamente).
William Turrell
15

Hay una línea en wp-config.php:

define('DB_CHARSET', 'utf8mb4');

Si sigue las instrucciones de Markouver / Evster , no olvide cambiar esta línea en el servidor de producción a

define('DB_CHARSET', 'utf8');

para arreglar caracteres rotos de 4 bytes

Isk1n
fuente
1
Además, no olvide modificar define('DB_COLLATE', 'utf8_general_ci');también. Esto me ayudó.
Abduhafiz
10

Después de mucho tiempo de investigación, he encontrado la solución para lo anterior:

  1. En primer lugar, cambia el valor predeterminado de wp-config.php> Base de datos DB_CHARSET a "utf8"

  2. Haga clic en la pestaña "Exportar" para la base de datos

  3. Haga clic en el botón de opción "Personalizado"

  4. Vaya a la sección titulada "Opciones específicas de formato" y cambie el menú desplegable "Sistema de base de datos o servidor MySQL anterior para maximizar la compatibilidad de salida con:" de NINGUNO a MYSQL40.

  5. Desplácese hasta la parte inferior y haga clic en ir

Entonces estás en.

Dead Boyz
fuente
7

Parece que su host no proporciona una versión MySQL que sea capaz de ejecutar tablas con intercalación utf8mb4.

Las tablas de WordPress se cambiaron a utf8mb4 con la Versión 4.2 (lanzada el 23 de abril de 2015) para admitir Emojis, pero necesita MySQL 5.5.3 para usarlo.5.5.3. es de marzo de 2010, por lo que normalmente debería estar ampliamente disponible. ¿Puedes comprobar si tu proveedor proporciona esa versión?

De lo contrario, y no es posible una actualización, es posible que deba buscar otro proveedor de alojamiento para ejecutar las últimas versiones de WordPress (y siempre debe hacerlo por razones de seguridad).

flomei
fuente
1
Puede verificar su versión de MySQL a través de la línea de comando con "mysql -V"
Edd Smith
2

Así que resolví de esta manera, desde MySQL 5.6 a 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

(Opcional) Cree un .sql.gzarchivo:

$ gzip database_name.sql 

Explicación

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

Como se explica en esta respuesta , esto es solo el equivalente de estas opciones de phpMyAdmin: "Sistema de base de datos o servidor MySQL anterior para maximizar la compatibilidad de salida con:" menú desplegable seleccione "MYSQL 40" .

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

Necesitamos esto, para resolver este problema:

ERROR 1064 (42000) en la línea 18: tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de 'TYPE = InnoDB' en la línea 9

Andrea
fuente
1
Nota si está utilizando la versión de OS X de sed: $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. Si desea conservar una copia como database_name.sql.bakantes del reemplazo de sed:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier el
También puedes en línea sed.
davidbitton
Además, si está ejecutando mysqldump en MySQL 8, debe usar la --compatible=ansiopción
AbstractVoid el
1

También experimenté este problema. La solución que funcionó para mí fue abrir la base de datos local con Sequel Pro y actualizar la codificación y la clasificación a utf8 / utf8_bin para cada tabla antes de importar.

Damian Walsh
fuente
1

La forma más fácil de hacerlo es exportar su base de datos a .sql, ábrala en Notepad ++ y "Buscar y reemplazar" utf8mb4_unicode_cia utf8_unicode_ciy también reemplace utf8mb4a utf8. Además, no olvide cambiar la clasificación de la base de datos a utf8_unicode_ci(Operaciones> Clasificación).

Brane
fuente
0

abra el archivo sql en Notepad ++ y ctrl + H. luego ponga " utf8mb4" en la búsqueda y " utf8" en el reemplazo. El problema se solucionará entonces.

Juan
fuente
Dice "colación desconocida utf8"
Cristian Traìna