Series de caracteres

Una serie de caracteres es una secuencia de unidades de código. La longitud de la serie es el número de unidades de código en la secuencia. Si la longitud es cero, el valor se llama la serie vacía, que no se debe confundir con el valor nulo.

Serie de caracteres de longitud fija (CHAR)

Todos los valores de una columna de series de longitud fija tienen la misma longitud, que está determinada por el atributo de longitud de la columna. El atributo de longitud debe estar dentro del rango de 1 a 255, inclusive, a menos la unidad de serie es CODEUNITS32, que tiene un rango de 1 a 63, inclusive.

Series de caracteres de longitud variable

Existen dos tipos de series de caracteres de longitud variable:
VARCHAR
Un valor VARCHAR puede tener hasta 32.672 de longitud. Si la unidad de serie es CODEUNITS32, la longitud puede tener hasta 8.168 unidades de serie.
CLOB
Una valor de objeto grande de carácter (CLOB) puede tener una longitud máxima de 2 gigabytes menos 1 byte (2.147.483.647 bytes)o, si la unidad de serie es CODEUNITS32, de hasta 536.870.911 unidades de serie. Un CLOB se utiliza para almacenar datos basados en caracteres SBCS grandes o mixtos (SBCS y MBCS) (como por ejemplo documentos escritos con un solo conjunto de caracteres) y, por lo tanto, tiene una página de códigos SBCS o mixtos que está asociada a él.
Se aplican restricciones especiales a las expresiones que dan como resultado un tipo de datos CLOB, y a columnas de tipo estructurado; dichas expresiones y columnas no están permitidas en:
  • Una lista SELECT que va precedida por la cláusula DISTINCT
  • Una cláusula GROUP BY
  • Una cláusula ORDER BY
  • Una subselección de un operador de conjunto que no sea UNION ALL
  • Un predicado BETWEEN o IN básico y cuantificado
  • Una función agregada
  • Las funciones escalares VARGRAPHIC, TRANSLATE y de fecha y hora
  • El operando patrón de un predicado LIKE o el operando de serie de búsqueda de una función POSSTR
  • La representación en una serie de un valor de fecha y hora.

Las funciones del esquema SYSFUN que toman un VARCHAR como argumento no aceptarán VARCHAR con una longitud superior a 4.000 bytes como argumento. Sin embargo, muchas de estas funciones también pueden tener una signatura alternativa que acepte un CLOB(1M). Para estas funciones, el usuario puede convertir explícitamente las series VARCHAR mayores que 4.000 en CLOB y, a continuación, volver a convertir el resultado en VARCHAR de la longitud necesaria.

Las series de caracteres terminadas en NUL que se encuentran en C se manejan de manera diferente, dependiendo del nivel de estándares de la opción de precompilación.

Cada serie de caracteres se define con más detalle como:
Datos de bit
Datos que no están asociado con una página de códigos.
Datos de juego de caracteres de un solo byte (SBCS)
Datos en los que cada carácter está representado por un solo byte.
Datos mixtos
Datos que pueden contener una mezcla de caracteres de un juego de caracteres de un solo byte y de un juego de caracteres de múltiples bytes (MBCS).
Nota: El tipo de datos LONG VARCHAR sigue estando soportado pero ha quedado obsoleto, no es recomendable y puede eliminarse en un release futuro.

Especificación de unidades de serie para las series de caracteres

La unidad de longitud para el tipo de datos de la serie de caracteres es OCTETS o CODEUNITS32. La unidad de longitud define el método de conteo que se utiliza para determinar la longitud de los datos.
OCTETS
Indica que las unidades del atributo de longitud son bytes. Esta unidad de longitud aplica a todos los tipos de datos de la serie de caracteres en una base de datos que no es Unicode. En una base de datos Unicode, los OCTETS se pueden especificar de forma explícita o se determinan en base a una configuración de entorno.
CODEUNITS32
Indica que las unidades del atributo de longitud están en unidades de código Unicode UTF-32 que aproximan el conteo en caracteres. Esta unidad de longitud no afecta la página de código subyacente del tipo de datos. La longitud real del valor de datos se determina mediante el conteo de las unidades de código UTF-32 como si los datos fueran convertidos a UTF-32. Una unidad de serie de CODEUNITS32 se puede utilizar solamente en una base de datos Unicode. CODEUNITS32 se puede especificar de forma explícita o determinar en base a una configuración de entorno.

En una base de datos que no sea Unicode, la unidad de serie siempre es OCTETS y no se puede cambiar. En una base de datos Unicode, las unidades de serie se pueden especificar explícitamente con el atributo de longitud de un tipo de datos de serie de caracteres, o puede ser un valor predeterminado con base en un valor de entorno. Si también se especifica FOR BIT DATA para el tipo de datos de la serie de caracteres, no se puede especificar CODEUNITS32 y no aplica un valor de entorno de CODEUNITS32.

El valor de entorno para las unidades de serie se basa en el valor de la variable global NLS_STRING_UNITS, o el parámetro de configuración de la base de datos string_units. El parámetro de configuración de la base de datos se puede establecer en SYSTEM o CODEUNITS32. La variable global también se puede establecer en SYSTEM o CODEUNITS32, pero también se puede establecer en NULL. El valor NULL indica que la sesión SQL debe utilizar el valor del parámetro de configuración de la base de datos string_units. Si el valor de la configuración del entorno es SYSTEM, entonces se utiliza OCTETS como la configuración de las unidades de serie predeterminada.

Unidades de serie en las funciones integradas

La capacidad para especificar unidades de serie para determinadas funciones de serie incorporadas permite procesar los datos de las series "basándose más en los caracteres" que "en los bytes". La unidad de serie determina la unidad que se utiliza para la longitud o posición cuando ejecuta la función. Puede especificar CODEUNITS16, CODEUNITS32, o OCTETS como unidad de serie para algunas funciones de serie. Cuando no se especifica una unidad de serie, la unidad de serie predeterminada usualmente se determina mediante las unidades de serie del argumento de la serie origen (consulte la descripción de la función que está utilizando para conocer los detalles). El argumento de las unidades de serie se puede especificar para las funciones de serie que soportan el parámetro en las bases de datos Unicode o que no son de Unicode.

CODEUNITS16
Especifica que la unidad de la operación será Unicode UTF-16. CODEUNITS16 es útil cuando una aplicación está procesando datos en unidades de código que tienen 2 bytes de ancho. Tenga en cuenta que algunos caracteres, que se conocen como caracteres complementarios, requieren dos unidades de código UTF-16 para codificarse. Por ejemplo, la clave G de símbolo musical necesita dos unidades de código UTF-16 (X'D834' y X'DD1E' en UTF-16BE).
CODEUNITS32
Especifica que la unidad de operación será Unicode UTF-32. CODEUNITS32 es útil en el caso de aplicaciones que procesan datos en un formato sencillo, de longitud fija, que debe devolver la misma respuesta, con independencia del formato de almacenamiento de los datos (ASCII, UTF-8 o UTF-16).

Puesto que CHAR es un tipo de longitud fija, Db2 rellena la serie con espacios en blanco para completar la longitud definida. La longitud definida aquí es 5 * CODEUNITS32, que es 20 bytes y se almacena en el almacenamiento de disco - página / nivel inferior. VARCHAR(x CODEUNITS16) significará x caracteres de 2 bytes, VARCHAR(x CODEUNITS32) significará x caracteres de 4 bytes y VARCHAR(x OCTETS) significará x bytes.

Por ejemplo, CHAR(5 CODEUNITS32), el almacenamiento de 'abc' se maneja en la memoria como 'abc ' (dos espacios) para satisfacer la definición lógica de la columna. Sin embargo, en el disco se almacena como 'abc' (17 espacios) dado que la capa de Db2 Data Management Services lrequiere la columna para satisfacer la definición física.

Nota: El almacenamiento en disco utiliza la codificación UTF-8.
OCTETS
Especifica que las unidades de operación son los bytes. OCTETS se utiliza a menudo cuando una aplicación tiene interés en asignar espacio de almacenamiento intermedio o cuando las operaciones necesitan utilizar un proceso de bytes sencillo.

La longitud calculada de una serie obtenida mediante OCTETS (bytes) puede ser diferente de la que se calcula mediante CODEUNITS16 o CODEUNITS32. Cuando utiliza OCTETS, la longitud de la serie se determina al simplemente contar el número de bytes en la serie. Cuando utiliza CODEUNITS16 o CODEUNITS32, la longitud de la serie se determina al contar el número de unidades de código de 16 bits o 32 bits necesarios para representar la serie en UTF-16 o UTF-32. Una longitud que se determina mediante el uso de CODEUNITS16 y CODEUNITS32 es idéntica a menos que los datos incluyan caracteres complementarios.

Por ejemplo, suponga que NAME, una columna VARCHAR(128) que está codificada en Unicode UTF-8, contiene el valor 'Jürgen'. Las dos consultas siguientes, que cuentan la longitud de la cadena en CODEUNITS16 o CODEUNITS32, devuelven el mismo valor (6).
   SELECT CHARACTER_LENGTH(NAME,CODEUNITS16) FROM T1
     WHERE NAME = 'Jürgen'

   SELECT CHARACTER_LENGTH(NAME,CODEUNITS32) FROM T1
     WHERE NAME = 'Jürgen'
La consulta siguiente, que cuenta la longitud de la serie en OCTETS, devuelve el valor 7.
   SELECT CHARACTER_LENGTH(NAME,OCTETS) FROM T1
     WHERE NAME = 'Jürgen'
Estos valores representan la longitud de la serie que se expresa en la unidad de serie especificada.
La tabla siguiente muestra las representaciones UTF-8, UTF-16BE (big-endian), y UTF-32BE (big-endian) del nombre 'Jürgen':
Formato    Representación del nombre 'Jürgen'
--------  --------------------------------------
UTF-8	  X'4AC3BC7267656E'
UTF-16BE 	X'004A00FC007200670065006E'
UTF-32BE 	X'0000004A000000FC0000007200000067000000650000006E'
La representación del carácter 'ü' difiere en las tres unidades de serie:
  • La representación UTF-8 del carácter 'ü' es X'C3BC'.
  • La representación UTF-16BE del carácter 'ü' es X'00FC'.
  • La representación UTF-32BE del carácter 'ü' es X'000000FC'.

La especificación de unidades de serie para una función integrada no afecta el tipo de datos, las unidades de serie, ni la página de códigos del resultado de la función. Si es necesario, los datos a se convierten a Unicode para evaluarse cuando se especifica CODEUNITS16 o CODEUNITS32.

Cuando se especifica OCTETS para la función LOCATE o POSITION y las páginas de código de los argumentos de serie difieren, los datos se convierten a la página de códigos del argumento serie-origen. En dicho caso, el resultado de la función se encuentra en la página de códigos del argumento serie-fuente. Cuando se especifica OCTETS para funciones que toman un único argumento de serie, los datos se evalúan en la página de códigos del argumento de la serie y el resultado de la función se encontrará en la página de códigos del argumento de la serie.

Diferencia entre CODEUNITS16 y CODEUNITS32

Cuando se especifica CODEUNITS16 o CODEUNITS32, el resultado será el mismo, salvo en el caso de los datos que contengan caracteres Unicode suplementarios. Esto se debe a que los caracteres Unicode suplementarios se representan mediante dos unidades de código UTF-16 o una unidad de código UTF-32. En UTF-8, los caracteres que no sean suplementarios se representan mediante 1 a 3 bytes, y un carácter suplementario se representa mediante 4 bytes. En UTF-16, los caracteres que no sean suplementarios están representados por una unidad de código CODEUNITS16 o 2 bytes y un carácter suplementario está representado mediante dos unidades de código CODEUNITS16 o 4 bytes. En UTF-32, un carácter se representa mediante una unidad de código CODEUNITS32 o 4 bytes.

Por ejemplo, la tabla siguiente muestra los valores hexadecimales de la A mayúscula matemática en negrita y la A mayúscula latina. La A mayúscula matemática en negrita es un carácter suplementario que se representa mediante 4 bytes en UTF-8, UTF-16 y UTF-32.
Carácter Representación UTF-8 Representación UTF-16BE Representación UTF-32BE
Valor Unicode X'1D400' - 'A'; A mayúscula matemática en negrita X'F09D9080' X'D835DC00' X'0001D400'
Valor Unicode X'0041' - 'A'; A mayúscula latina X'41' X'0041' X'00000041'
Supongamos que C1 es una columna VARCHAR(128), codificada en Unicode UTF-8, y que la tabla T1 contiene una fila con el valor de la A mayúscula matemática en negrita (X'F09D9080'). Las consultas siguientes devuelven resultados diferentes:
Consulta                                             Devuelve
-----                                                -------
SELECT CHARACTER_LENGTH(C1,CODEUNITS16) FROM T1      2

SELECT CHARACTER_LENGTH(C1,CODEUNITS32) FROM T1      1

SELECT CHARACTER_LENGTH(C1,OCTETS) FROM T1           4