miércoles, 1 de abril de 2015

Diferencia entre CHAR y VARCHAR en MySQL

Un aspecto importante a la hora de diseñar bases de datos es definir de forma correcta los tipos de datos que se almacenarán en cada campo, ya que esto a largo plazo y dependiendo del volumen de transacciones que maneje la base de datos impactará en su rendimiento.


MySQL provee muchos tipos de datos, los cuales muchas veces resultan ambiguos pero que de fondo difieren en la forma en que son tratadas por el motor. Un claro ejemplo son los tipos CHAR y VARCHAR que nos permiten almacenar cadenas alfanuméricas, los cuales ha simple vista parecen iguales pero que como veremos a continuación difieren en la longitud máxima permitida, en la manera en que son almacenados, y en como son recuperados.


Cuando se declara un valor tipo CHAR el campo se crea con la longitud fija indicada al crear la tabla, la cual debe ser entre 0 y 255. Dado que es un tipo de longitud fija, al momento de almacenar datos en una columna CHAR, se rellenará con espacios en blanco las posiciones que no son ocupadas por los caracteres de la cadena que se está almacenando, caracteres que se eliminan cuando el dato es recuperado.


En contra parte los campos tipo VARCHAR son de longitud variable, que deber ser entre 0 y 65.535. Cuando se declara un valor tipo VARCHAR el motor de MySQL reserva 1 o 2 Bytes para ser usados como un prefijo de longitud, que almacena el valor de la longitud en Bytes de la cadena que se está almacenando. Si la cadena tiene una longitud de 255 o menos reserva 1 Byte, si la longitud es de 256 hasta 65.535 reserva 2 Bytes.


Con base a lo anterior podemos concluir que VARCHAR es más adecuado para cadenas que superan los 255 caracteres de longitud; sin embargo por ser un tipo de datos estático, CHAR tiende a ser más rápido que VARCHAR, lo cual lo convierte en la mejor alternativa si lo que se busca es un mejor rendimiento.


Un ejemplo de uso correcto de estos tipos de datos sería por ejemplo: usar CHAR para almacenar los hashes de contraseñas encriptadas con SHA1 ya que este algoritmo siempre genera cadenas de 40 caracteres, y usar VARCHAR para almacenar datos como direcciones o nombres de personas ya que estos datos son de longitud variable.

Más información en https://dev.mysql.com/doc/refman/5.0/en/char.html