Los tipos CHAR
y VARCHAR
son similares, pero difieren en cómo se almacenan y recuperan.
Desde MySQL 5.0.3, también difieren en la longitud máxima y en
cómo se tratan los espacios finales.
Los tipos CHAR
y VARCHAR
se declaran con una longitud que indica el máximo número de
caracteres que quiere almacenar. Por ejemplo,
CHAR(30)
puede almacenar hasta 30 caracteres.
La longitud de una columna CHAR
se fija a la
longitud que se declara al crear la tabla. La longitud puede ser
cualquier valor de 0 a 255. Cuando los valores
CHAR
se almacenan, se añaden espacios a la
derecha hasta las longitud específica. Cuando los valores
CHAR
se recuperan, estos espacios se borran.
Los valores en columnas VARCHAR
son cadenas
de caracteres de longitud variable. En MySQL 5.0, la longitud
puede especficarse de 0 a 255 antes de MySQL 5.0.3, y de 0 a
65,535 en 5.0.3 y versiones posteriores. (La máxima longitud
efectiva de un VARCHAR
en MySQL 5.0 se
determina por el tamaño de registro máximo y el conjunto de
caracteres usados. La longitud máxima total es de 65,532
bytes.)
En contraste con CHAR
,
VARCHAR
almacena los valores usando sólo los
caracteres necesarios, más un byte adicional para la longitud
(dos bytes para columnas que se declaran con una longitud
superior a 255).
Los valores VARCHAR
no se cortan al
almacenarse. El tratamiento de espacios al final depende de la
versión. Desde MySQL 5.0.3, los espacios finales se almacenan
con el valor y se retornan, según el estándar SQL. Antes de
MySQL 5.0.3, los espacios finales se eliminan de los valores
cuando se almacenan en una columna VARCHAR
,
esto significa que los espacios también están ausentes de los
valores retornados.
Durante el almacenamiento y la recuperación de valores no hace ninguna conversión de mayúsculas y minúsculas.
Si asigna un valor a una columna CHAR
o
VARCHAR
que exceda la longitud máxima de la
columna, el valor se trunca. Si los caracteres truncados no son
espacios, se genera una advertencia. Puede hacer que aparezca un
error en lugar de una advertencia usando modo SQL estricto.
Consulte Sección 5.3.2, “El modo SQL del servidor”.
Antes de MySQL 5.0.3, si necesita un tipo de datos para el que
no se borren los espacios finales, considere usar un tipo
BLOB
o TEXT
. También, si
quiere almacenar valores binarios como resultados de
encriptación o compresión que puedan contener valores byte
arbitrarios, use una columna BLOB
en lugar de
CHAR
o VARCHAR
, para
evitar problemas potenciales con eliminación de espacios
finales que puedan cambiar los valores de los datos.
La siguiente tabla ilustra las diferencias entre los dos tipos
de columnas mostrando el resultado de almacenar varios valores
de cadenas de caracteres en columnas CHAR(4)
y VARCHAR(4)
:
Valor | CHAR(4) |
Almacenamiento necesario | VARCHAR(4) |
Almacenamiento necesario |
'' |
' ' |
4 bytes | '' |
1 byte |
'ab' |
'ab ' |
4 bytes | 'ab' |
3 bytes |
'abcd' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
'abcdefgh' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
Los valores retornados de las columnas
CHAR(4)
y VARCHAR(4)
son
los mismos en cada caso, ya que los espacios finales se eliminan
en la recuperación de valores CHAR
.
En MySQL 5.0, los valores en columnas CHAR
y
VARCHAR
se almacenan y comparan según la
colación del conjunto de caracteres asignado a la columna.
CHAR BYTE
es un alias para CHAR
BINARY
. Existe por cuestión de compatibilidad.
El atributo ASCII
asigna el conjunto de
caracteres latin1
a una columna
CHAR
. El atributo UNICODE
asigna el conjunto de caracteres ucs2
.
MySQL puede cambiar silenciosamente el tipo de una columna
CHAR
o VARCHAR
en tiempo
de creación. Consulte Sección 13.1.5.1, “Cambios tácitos en la especificación de columnas”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.