Diferencias entre utf8 y latin1

128

¿Cuál es la diferencia entre utf8 y latin1?

binbash
fuente
3
Son codificaciones diferentes (con algunos caracteres asignados a secuencias de bytes comunes, por ejemplo, los caracteres ASCII y muchas letras acentuadas). UTF-8 es una codificación de Unicode con todos sus puntos de código; Latin1 codifica menos de 256 caracteres.
ShreevatsaR
También hay latin9 que está disponible en configuraciones regionales de Linux y podría haberse mencionado en la pregunta: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Respuestas:

151

UTF-8 está preparado para dominar el mundo, Latin1 no lo está.

Si está tratando de almacenar caracteres no latinos como chino, japonés, hebreo, ruso, etc., usando la codificación Latin1, entonces terminarán como mojibake . Puede encontrar útil el texto introductorio de este artículo (e incluso más si conoce un poco de Java).

Tenga en cuenta que el soporte completo de 4 bytes UTF-8 solo se introdujo en MySQL 5.5. Antes de esa versión, solo sube a 3 bytes por carácter, no a 4 bytes por carácter. Por lo tanto, solo admite el plano BMP y no, por ejemplo, el plano Emoji. Si desea compatibilidad total con UTF-8 de 4 bytes, actualice MySQL a al menos 5.5 o elija otro RDBMS como PostgreSQL. En MySQL 5.5+ se llama utf8mb4.

BalusC
fuente
31
Mysql 5.1 admite 3 bytes UTF-8, sin embargo, Mysql 5.5 admite 4 bytes UTF-8 como utf8mb4.
velcrow
2
@BalusC ¿Puedes dar más detalles sobre cómo UTF-8 no es totalmente compatible? ¿Significa que Mysql 5.1 no puede almacenar todos los caracteres Unicode?
Pacerier
2
@Pacerier: solo admite 3 bytes por carácter, por lo que solo se admite el BMP (los primeros 65535 caracteres), el resto no. Para todos los personajes, ver en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@BalusC En cuanto a las personas que usan 5.1.63 y no tienen el privilegio de actualizar la versión mysql del servidor web, ¿cuáles pueden ser las alternativas?
Pacerier
66
@Pacerier: Puede guardar como en VARBINARYlugar de VARCHARdecodificar / codificar en el nivel empresarial usted mismo, pero esto es hacky. Considere hacer una nueva pregunta, tal vez hay mejores formas.
BalusC
47

En latin1 cada carácter tiene exactamente un byte de longitud. En utf8, un carácter puede constar de más de un byte. En consecuencia, utf8 tiene más caracteres que latin1 (y los caracteres que tienen en común no están necesariamente representados por el mismo byte / bytesequence).

sepp2k
fuente
1
¿Qué pasa con ascii y bin?
Yousha Aleayoub
8
@YoushaAleayoub ASCII es una codificación de un solo byte que utiliza los caracteres del 0 al 127, por lo que puede codificar la mitad de caracteres que latin1. Es un subconjunto estricto de latin1 y utf8, lo que significa que los bytes 0 a 127 en latin1 y utf8 codifican las mismas cosas que en ASCII. Bin no es una codificación. Por lo general, es una opción que puede dar al leer un archivo, diciéndole a las funciones IO que no apliquen ninguna codificación, sino que solo lean el archivo byte por byte.
sepp2k
1
gracias, quise decir binarycotejar ...? y cuál es mejor para los campos de inglés / numéricos: ascii_general_cio ascii_bin?
Yousha Aleayoub