systemadmin.es » DBA » Tamaño caracteres especiales en UTF-8 con varchar en MySQL

Tamaño caracteres especiales en UTF-8 con varchar en MySQL

Si se quiere migrar de una base de datos en, por ejemplo, latin1 a UTF8 deberemos tener en cuenta que este último es multibyte (un carácter se puede codificar de uno a cuatro bytes)

Vamos a ver el caso del varchar creando una tabla de ejemplo:

mysql> create table utf(id varchar(1))DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.05 sec)

Si a continuación inserimos un carácter especial en el varchar(1) veremos que no se guarda correctamente:

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into utf values('í');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from utf;
+------+
| id   |
+------+
|      |
+------+
1 row in set (0.00 sec)

El tipo varchar no considera como un solo elemento los caracteres especiales en UTF-8, por lo que como mucho una misma cadena en latin1 podría llegar a necesitar un varchar cuatro veces más grande. A nivel practico siempre necesitaremos mucho menos, ya que ni todos los caracteres UTF-8 ocupan 4 bytes, ni todos los elementos de un string son especiales pero se deberá tener en cuenta este posible incremento del tamaño medio de los varchar.

Relacionados

Imprimir Imprimir

4 comments to “Tamaño caracteres especiales en UTF-8 con varchar en MySQL”

  1. Entonces, el warning que se produce en la inserción, ¿a qué se debe?

    Gracias y de nuevo un buen post!

  2. Sin duda es un problema a tener en cuenta, yo tenía la idea de que reservabas caracteres y no bytes. Determinar el número de bytes necesarios para cada caso debería ser tarea de la base de datos

  3. Precisamente te avisa de este problema, intentas añadir 2 bytes pero solo le caben uno (trunca)

  4. Es lo que esperaríamos todos, simplemente tenemos que tener en cuenta este detalle al hacerlo.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>