sirve qué para etiqueta charset mysql unicode utf-8 character-encoding mariadb

mysql - para qué sirve la etiqueta meta charset utf 8>?



Problemas con los caracteres UTF-8; lo que veo no es lo que almacené (4)

Dependiendo de cómo esté configurado el servidor, debe cambiar la codificación en consecuencia. utf8 de lo que dijo debería funcionar mejor, sin embargo, si obtiene caracteres extraños, podría ayudar si cambia la página web Encode a Ansi. Esto me ayudó cuando estaba configurando un PHP MYSQLI, esto podría ayudarlo a comprender más https://superuser.com/questions/762473/ansi-to-utf-8-in-notepad

Traté de usar UTF-8 y tuve problemas.

He intentado muchas cosas; Aquí están los resultados que he obtenido:

  • ???? en lugar de caracteres asiáticos. Incluso para el texto europeo, tengo Se?or para Señor .
  • Extraños galimatías (¿Mojibake?) Como Señor o 新浪新闻 para 新浪新闻 .
  • Diamantes negros, como el Señor.
  • Finalmente, me metí en una situación en la que los datos se perdieron, o al menos se truncaron: Se para Señor .
  • Incluso cuando conseguí que el texto se viera bien, no se ordenó correctamente.

¿Qué estoy haciendo mal? ¿Cómo puedo arreglar el código ? ¿Puedo recuperar los datos? De ser así, ¿cómo?


Es curioso cómo respondes tu propia pregunta :)

  1. Establezca su idioma IDE de código en UTF8

  2. Agregue al encabezado de su página web donde recopila el formulario de datos.

  3. Verifique que la definición de su tabla MySQL se vea así:

    CREATE TABLE your_table ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  4. Si está utilizando PDO, asegúrese de

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>''SET NAMES utf8''); $dbL = new PDO($pdo, $user, $pass, $options);

Si ya tiene una base de datos grande con el problema anterior, puede intentar que SIDU exporte con el juego de caracteres correcto e importe de nuevo con UTF8. Buena suerte


Este problema afecta a los participantes de este sitio y muchos otros.

Ha enumerado los cinco casos principales de problemas de CHARACTER SET .

Mejores prácticas

En el futuro, es mejor usar CHARACTER SET utf8mb4 y COLLATION utf8mb4_unicode_520_ci . (Hay una versión más nueva de la clasificación Unicode en la tubería).

utf8mb4 es un superconjunto de utf8 en el utf8 de que maneja códigos utf8 de 4 bytes, que son necesarios para Emoji y algunos chinos.

Fuera de MySQL, "UTF-8" se refiere a todas las codificaciones de tamaño, por lo tanto, efectivamente es lo mismo que utf8mb4 de MySQL, no utf8 .

Trataré de usar esas ortografías y mayúsculas para distinguir dentro de MySQL dentro y fuera de lo siguiente.

Resumen de lo que debes hacer

  • Tenga su editor, etc. configurado en UTF-8.
  • Los formularios HTML deben comenzar como <form accept-charset="UTF-8"> .
  • Tener sus bytes codificados como UTF-8.
  • Establezca UTF-8 como la codificación que se utiliza en el cliente.
  • Haga que la columna / tabla se declare CHARACTER SET utf8mb4 ( CHARACTER SET utf8mb4 con SHOW CREATE TABLE ).
  • <meta charset=UTF-8> al comienzo de HTML
  • Las rutinas almacenadas adquieren el conjunto de caracteres / colación actual. Pueden necesitar reconstrucción.

UTF-8 hasta el final

Más detalles para los lenguajes de computadora (y sus siguientes secciones)

Probar los datos

No se puede confiar en ver los datos con una herramienta o con SELECT . Demasiados clientes, especialmente los navegadores, intentan compensar las codificaciones incorrectas y le muestran el texto correcto incluso si la base de datos está destrozada. Por lo tanto, elija una tabla y columna que tenga texto que no esté en inglés y haga

SELECT col, HEX(col) FROM tbl WHERE ...

El HEX para UTF-8 correctamente almacenado será

  • Para un espacio en blanco (en cualquier idioma): 20
  • Para inglés: 4x , 5x , 6x o 7x
  • Para la mayor parte de Europa occidental, las letras acentuadas deben ser Cxyy
  • Cirílico, hebreo y farsi / árabe: Dxyy
  • La mayor parte de Asia: Exyyzz
  • Emoji y algunos chinos: F0yyzzww
  • Más detalles

Causas específicas y soluciones de los problemas vistos.

Texto truncado ( Se para Señor ):

  • Los bytes a almacenar no están codificados como utf8mb4. Arregla esto.
  • Además, verifique que la conexión durante la lectura sea UTF-8.

Diamantes negros con signos de interrogación ( Señor para Señor ); Existe uno de estos casos:

Caso 1 (los bytes originales no eran UTF-8):

  • Los bytes que se almacenarán no están codificados como utf8. Arregla esto.
  • La conexión (o SET NAMES ) para INSERT y SELECT no era utf8 / utf8mb4. Arregla esto.
  • Además, verifique que la columna en la base de datos sea CHARACTER SET utf8 (o utf8mb4).

Caso 2 (los bytes originales eran UTF-8):

  • La conexión (o SET NAMES ) para SELECT no era utf8 / utf8mb4. Arregla esto.
  • Además, verifique que la columna en la base de datos sea CHARACTER SET utf8 (o utf8mb4).

Los diamantes negros se producen solo cuando el navegador está configurado en <meta charset=UTF-8> .

Signos de interrogación (regulares, no diamantes negros) ( Se?or para Señor ):

  • Los bytes a almacenar no están codificados como utf8 / utf8mb4. Arregla esto.
  • La columna en la base de datos no es CHARACTER SET utf8 (o utf8mb4). Arregla esto. (Utilice SHOW CREATE TABLE ).
  • Además, verifique que la conexión durante la lectura sea UTF-8.

Mojibake ( Señor Señor Señor ): (Esta discusión también se aplica a la codificación doble , que no es necesariamente visible).

  • Los bytes que se almacenarán deben estar codificados en UTF-8. Arregla esto.
  • La conexión al INSERTing y SELECTing texto debe especificar utf8 o utf8mb4. Arregla esto.
  • La columna debe declararse CHARACTER SET utf8 (o utf8mb4). Arregla esto.
  • HTML debería comenzar con <meta charset=UTF-8> .

Si los datos parecen correctos, pero no se ordenan correctamente, entonces ha elegido la clasificación incorrecta, o no hay una clasificación que se adapte a sus necesidades, o tiene doble codificación .

La codificación doble se puede confirmar haciendo SELECT .. HEX .. descrito anteriormente.

é should come back C3A9, but instead shows C383C2A9 The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD

Es decir, el hex es aproximadamente el doble de lo que debería ser. Esto se debe a la conversión de latin1 (o lo que sea) a utf8, luego trata esos bytes como si fueran latin1 y repite la conversión. La ordenación (y comparación) no funciona correctamente porque, por ejemplo, está ordenando como si la cadena fuera Señor .

Arreglando los datos, donde sea posible

Para el truncamiento y los signos de interrogación , los datos se pierden.

Para Mojibake / Doble codificación , ...

Para diamantes negros , ...

(Tendré que continuar esto en otra pregunta / respuesta).


Tuve problemas similares con 2 de mis proyectos, después de una migración del servidor. Después de buscar y probar muchas soluciones, me encontré con esta:

mysqli_set_charset($con,"utf8");

¡Después de agregar esta línea a mi archivo de configuración, todo funciona bien!

Encontré esta solución para mysqli https://www.w3schools.com/PHP/func_mysqli_set_charset.asp cuando estaba buscando resolver un inserto de la consulta html

¡buena suerte!