11.4. Tipos de cadenas de caracteres

MySQL 5.0

11.4. Tipos de cadenas de caracteres

Los tipos de cadenas de carácteres son , , , , , , , y . Esta sección describe cómo funcionan estos tipos y cómo usarlo en sus consultas.

11.4.1. Los tipos CHAR y VARCHAR

Los tipos y 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 y se declaran con una longitud que indica el máximo número de carácteres que quiere almacenar. Por ejemplo, puede almacenar hasta 30 carácteres.

La longitud de una columna 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 se almacenan, se añaden espacios a la derecha hasta las longitud específica. Cuando los valores se recuperan, estos espacios se borran.

Los valores en columnas son cadenas de carácteres 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 en MySQL 5.0 se determina por el tamaño de registro máximo y el conjunto de carácteres usados. La longitud máxima total es de 65,532 bytes.)

En contraste con , almacena los valores usando sólo los carácteres necesarios, más un byte adicional para la longitud (dos bytes para columnas que se declaran con una longitud superior a 255).

Los valores 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ándard SQL. Antes de MySQL 5.0.3, los espacios finales se eliminan de los valores cuando se almacenan en una columna , 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 o que exceda la longitud máxima de la columna, el valor se trunca. Si los carácteres 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 o . También, si quiere almacenar valores binarios como resultados de encriptación o compresión que puedan contener valores byte arbitrarios, use una columna en lugar de o , 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 carácteres en columnas y :

Valor Almacenamiento necesario Almacenamiento necesario
4 bytes 1 byte
4 bytes 3 bytes
4 bytes 5 bytes
4 bytes 5 bytes

Los valores retornados de las columnas y son los mismos en cada caso, ya que los espacios finales se eliminan en la recuperación de valores .

En MySQL 5.0, los valores en columnas y se almacenan y comparan según la colación del conjunto de carácteres asignado a la columna.

es un alias para . Existe por cuestión de compatibilidad.

El atributo asigna el conjunto de carácteres a una columna . El atributo asigna el conjunto de carácteres .

MySQL puede cambiar silenciosamente el tipo de una columna o en tiempo de creación. Consulte Sección 13.1.5.1, “Cambios tácitos en la especificación de columnas”.

11.4.2. Los tipos BINARY y VARBINARY

Los tipos y son similares a y , excepto que contienen cadenas de carácteres binarias en lugar de cadenas de carácteres no binarias. Esto es, contienen cadenas de bytes en lugar de cadenas de carácteres. Esto significa que no tienen conjunto de carácteres asignado, y la comparación y ordenación se basa en los valores numéricos de los valores de los bytes.

La longitud máxima disponible es la máxima para t como para y , excepto que la longitud para y es una longitud en bytes en lugar de en carácteres.

El tratamiento de los espacios finales es el mismo para y como lo es para y . Cuando se almacenan los valores , se rellenan con espacios a la derecha hasta la longitud especificada. Cuando los valores se recuperan, los espacios finales se eliminan. Para , los espacios finales se eliminan cuando los valores se almacenan. Desde MySQL 5.0.3, los espacios finales se mantienen. Debe considerar estas características si planea usar estos tipos de datos para almacenar datos binarios que deban acabar con espacios.

En MySQL 5.0, y son tipos de datos distintos. Para ) BINARY y ) BINARY, el atributo hace que se use la colación binaria para la columna, pero la columna no contiene cadenas de carácteres no binarios en lugar de cadenas binarias de bytes. Por ejemplo se trata como , asumiendo que el conjunto de carácteres por defecto es .

11.4.3. Los tipos BLOB y TEXT

Un es un objeto binario que puede tratar una cantidad de datos variables. Los cuatro tipos son , , , y . Difieren sólo en la longitud máxima de los valores que pueden tratar.

Los cuatro tipos son , , , y . Se corresponden a los cuatro tipos y tienen las mismas longitudes y requerimientos de almacenamiento.

Consulte Sección 11.5, “Requisitos de almacenamiento según el tipo de columna”.

Las columnas se tratan como cadenas de carácteres binarias (de bytes). Las columnas se tratan como cadenas de carácteres no binarias (de carácateres). Las columnas no tienen conjunto de carácteres, y la ordenación y la comparación se basan en los valores numéricos de los bytes. Las columnas tienen un conjunto de carácteres y se ordenan y comparan en base de la colación del conjunto de carácteres asignada a la columna desde MySQL 4.1.

No hay conversión de mayúsculas/minúsculas para columnas o durante el almacenamiento o la recuperación.

Si asiguna un valor a una columna o que exceda la longitud máxima del tipo de la columna, el valor se trunca. Si los carácteres truncados no son espacios, aparece una advertencia. Puede hacer que aparezca un error en lugar de una advertencia usando el modo SQL estricto. Consulte Sección 5.3.2, “El modo SQL del servidor”.

En la mayoría de aspectos, puede tratar una columna como que puede ser tan grande como desee. Similarmente, puede tratar columnas como . y difieren de y en los siguientes aspectos::

  • No se eliminan espacios al final para columnas y cuando los valores se almacenan o recuperan. Antes de MySQL 5.0.3, esto difiere de y , para los que se eliminaban los epacios al final cuando se almacenaban.

    Tenga en cuenta que realiza comparación espacial extendida para coincidir con el objeto comparado, exactamente como y .

  • Para índices en columnas y , debe especificar una longitud de prefijo para el índice. Para y , la longitud de prefijo es opciona. Consulte Sección 7.4.3, “Índices de columna”.

  • y no pueden tener valores .

En MySQL 5.0, y se mapean con el tipo de datos . Esto existe por compatibilidad. Si usa el atributo con el tipo de columna , se asigna la colación binaria del conjunto de carácteres a la columna.

MySQL Connector/ODBC define los valores como y valores como .

Como los valores y pueden ser extremadamente grandes, puede encontrar algunas restricciones al usarlos:

  • Sólo los primeros bytes de la columna se usan al ordenar. El valor por defecto de es 1024; este valor puede cambiarse usando la opción al arrancar el servidor mysqld . Consulte Sección 5.3.3, “Variables de sistema del servidor”.

    Puede hacer que haya más bytes significativos al ordenar o agrupar incrementando el valor de en tiempo de ejecución. Cualquier cliente puede cambiar el valor de su variable de sesión :

    mysql> SET max_sort_length = 2000;
    mysql> SELECT id, comment FROM 
        -> ORDER BY comment;
    

    Otra forma de usar o en una columna o conteniendo valores grandes cuando quiere que más de bytes sean significativos es convertir el valor de la columna en un objeto de longitud fija. La forma estándard de hacerlo es con la función . Por ejemplo, el siguiente comando causa que 2000 bytes de la columna se tengan en cuenta para ordenación:

    mysql> SELECT id, SUBSTRING(comment,1,2000) FROM 
        -> ORDER BY SUBSTRING(comment,1,2000);
    
  • El tamaño máximo de un objeto o se determina por su tipo, pero el valor máximo que puede transmitir entre el cliente y el servidor viene determinado por la cantidad de memoria disponible y el tamaño de los buffers de comunicación. Puede cambiar el tamaño de los buffers de comunicación cambiando el valor de la variable , pero debe hacerlo para el servidor y los clientes . Por ejemplo, mysql y mysqldump le permite cambiar el valor de la variable del cliente . Consulte Sección 7.5.2, “Afinar parámetros del servidor”, Sección 8.3, “La herramienta intérprete de comandos mysql, y Sección 8.7, “El programa de copia de seguridad de base de datos mysqldump.

Cada valor o se representa internamente como un objeto a parte. Esto se hace en contraste con todos los otros tipos de columnas, para los que el almacenamiento se hace una vez por columna cuando se abre la tabla.

11.4.4. El tipo de columna ENUM

Un es un objeto de cadenas de carácteres con un valor elegido de una lista de valores permitidos que se enumeran explícitamente en la especificación de columna en tiempo de creación de la tabla.

El valor puede ser la cadena vacía () o bajo ciertas circunstancias:

  • Si inserta un valor inválido en un (esto es, una cadena de carácteres no presente en la lista de valores permitidos), la cadena vacía se inserta en lugar de un valor especial de error. Esta cadena puede distinguirse de una cadena vacía “normal” por el hecho que esta cadena tiene un valor numérico 0. Más información posteriormente.

  • Si se declara una columna para permitir , el valor es un valor legal para la columna, y el valor por defecto es . Si una columna se declara , su valor por defecto es el primer elemento de la lista de valores permitidos.

Cada valor de la enumeración tiene un índice:

  • Los valores de la lista de elementos permitidos en la especificación de la columna se numeran empezando por 1.

  • El valor de índice de la cadena errónea es 0. Esto significa que puede usar el siguiente comando para encontrar registros con el valor inválido asignado:

    mysql> SELECT * FROM  WHERE =0;
    
  • El índice del valor es .

Por ejemplo, una columna especificada como puede tener cualquiera de los valores mostrados aquí. El índice de cada valor se muestra:

Valor Índice
0
1
2
3

Una enumeración puede tener un máximo de 65,535 elementos.

Los espacios finales se borran automáticamente para valores miembros cuando se crea la tabla.

Cuando se reciben, los valores almacenados en una columna se muestran usando el formato de mayúsculas/minúsculas usado en la definición de la columna. En MySQL 4.1.1, las columnas pueden recibir un conjunto de carácteres y colación. Para colaciones binarias o sensibles a mayúsculas/minúsculas, el formato se tiene en cuenta al asignar valores a la columna.

Si recibe un valor en contexto numérico, se retorna el índice del valor. Por ejemplo, puede recibir valores numéricos de una columna así:

mysql> SELECT +0 FROM ;

Si almacena un número en una columna , el número se trata como índice, y el valor almacenado es el miembro de la enumeración con ese índice. (Sin embargo, esto no funciona con , que trata toda la entrada como cadenas de carácteres.) No es recomendable definir una columna con valores de enumeración que parezcan números, ya que esto puede causar confusión. Por ejemplo, la siguiente columna tiene miembros de enumeración con valores de , , y , pero valores de índice , , y :

numbers ENUM('0','1','2')

Los valores se ordenan según el order en que se enumeran los mienbros en la especificación de la columna. (En otras palabras, los valores se ordenan según sus números de índice.) Por ejemplo, se ordena antes que para , pero se ordena antes de para . La cadena vacía se ordena antes de las cadenas no vacías, y los valores se ordenan antes de todos los otros valores de la enumeración. Para evitar resultados inesperados, especifique la lista en orden alfabético. También puede usar o para asegurarse que la columna se ordena léxicamente en lugar de por número de índice.

Si quiere determinar todos los valores posibles para una columna , use LIKE y parsee la definición de en la segunda columna de la salida.

11.4.5. El tipo SET

Un es un objeto de cadenas de carácteres que tiene cero o más valores, cada uno de ellos debe elegirse de una lista de valores posibles especificada cuando se crea la tabla. Los valores de columnas que consisten de múltiples miembros del conjunto se especifican con los miembros separados por comas (''). Una consecuencia de esto es que los miembros de no pueden contener comas ellos mismos.

Por ejemplo, una columna especificada como puede tener cualquiera de estos valores:

''
'one'
'two'
'one,two'

Un puede tener un máximo de 64 miembros distintos.

Los espacios finales se borran automáticamente de los miembros de un cuando se crea la tabla.

Cuando se recuperan, los valors almacenados en una columna se muestran usando la sensibilidad de mayúsculas/minúsculas usando en la definición de la columna. En MySQL 5.0, las columnas pueden tener un conjunto de carácteres y colación. Para colaciones binarias o sensibles a mayúsculas/minúsculas, esta sensibilidad se tiene en cuenta al asignar valores a la columna.

MySQL almacena valores numéricamente, con el bit de menos peso del valor almacenado correspondiente al primer miembro del conjunto. Si recibe un valor en un contexto numérico, el valor recibido tiene los bits asignados correspondientes a los miembros que coinciden con el valor de la columna. Por ejemplo, puede recuperar los valores numéricos de una columna así:

mysql> SELECT +0 FROM ;

Si se almacena un número en una columna , los bits que se asignan en la representación binaria del número determinan los miembros del conjunto en el valor de la columna. Para una columna especificada como , los miembros tienen los siguientes valores decimales y binarios:

Miembro Valor decimal Valor binario

Si asigna un valor de a esta columna, esto es en binario, de forma que el primer y cuarto miembro del y se seleccionan y el valor resultante es .

Para un valor que contenga más de un elemento , no importa el orden en que se listen los elementos cuando inserte el valor. Tampoco no importa cuántas veces se lista un elemento dado para el valor. Cuando el valor se recupera posteriormente, cada elemento en el valor aparece una vez, con los elementos listados según el orden en que se especificaron al crear la tabla. Si una columna se especifica como , , , y aparecen como al recuperarse.

Si asigna un valor no soportado a una columna , el valor se ignora.

Los valores se ordenan numéricamente. Los valores se ordenan antes de los no .

Normalmente, busca valores usando la función o el operador :

mysql> SELECT * FROM  WHERE FIND_IN_SET('',)>0;
mysql> SELECT * FROM  WHERE  LIKE '%%';

El primer comando encuentra registros cuando contiene el miembro del conjunto. El segundo es similar, pero no igual: encuentra registros cuando contengan el valor en cualquier sitio, incluso cuando es una subcadena de otro miembro del conjunto.

Los siguientes comandos también son legales:

mysql> SELECT * FROM  WHERE  & 1;
mysql> SELECT * FROM  WHERE  = ',';

El primero de estos comandos busca valores que contengan el primer miembro del conjunto. El segundo busca una coincidencia exacta. Tenga cuidado con las comparaciones del segundo tipo. Comparar valores del conjunto ,' retorna distintos resultados que comparar valores de ,'. Debe especificar los valores en el mismo orden en que se listan en la definición de la columna.

Si desea determinar todos los valores posibles para una columna , use LIKE y parsee la definición de en la segunda columna de la salida.