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, tengoSe?or
paraSeñ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
paraSeñ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 :)
-
Establezca su idioma IDE de código en UTF8
-
Agregue al encabezado de su página web donde recopila el formulario de datos.
-
Verifique que la definición de su tabla MySQL se vea así:
CREATE TABLE your_table ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-
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
conSHOW 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.
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
o7x
-
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
) paraINSERT
ySELECT
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
) paraSELECT
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. (UtiliceSHOW 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
ySELECTing
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!