Conversiones entre tipos de datos

En muchas ocasiones, un valor con un tipo de datos determinado, necesita convertirse a otro tipo de datos diferente o al mismo tipo de datos, aunque con otra longitud, precisión o escala.

La promoción del tipo de datos es un ejemplo en el que la promoción de un tipo de datos a otro tipo de datos necesita que el valor se convierta al nuevo tipo de datos. Un tipo de datos que se puede convertir a otro tipo de datos es convertible de un tipo de datos fuente al tipo de datos de destino.

La conversión de un tipo de datos a otro tipo de datos puede producirse de forma implícita o explícita. Las funciones de conversión, la especificación CAST o la especificación XMLCAST pueden utilizarse para cambiar de forma explícita a un tipo de datos, según los tipos de datos implicados. Asimismo, cuando se crea una función derivada definida por el usuario, los tipos de datos de los parámetros de la función fuente deben poder convertirse en los tipos de datos de la función que se crea.

La Tabla 1 muestra las conversiones permitidas entre tipos de datos internos. La primera columna representa el tipo de datos del operando cast (tipo de datos fuente) y los tipos de datos de la fila de cabecera representan el tipo de datos de destino de la operación de conversión. Una 'S' indica que la especificación CAST se puede utilizar para combinar tipos de datos fuente y de destino. Los casos en los que sólo se puede utilizar la especificación XMLCAST se anotan.

Si se produce un truncamiento al convertir cualquier tipo de datos en un tipo de datos gráficos o de caracteres, se devuelve un aviso si se truncan caracteres distintos de espacios en blanco. Este comportamiento de truncamiento es distinto de la asignación a un tipo de datos de caracteres o gráficos cuando se produce un error si se trunca algún carácter que no es un blanco.

En una base de datos Unicode, los valores de origen de la serie gráfica y de caracteres se pueden convertir a diferentes unidades de serie. Cualquier truncamiento se aplica de acuerdo con las unidades de serie del tipo de datos destino.

Reciben soporte las siguientes conversiones que implican tipos diferenciados de tipificación firme (mediante la utilización de la especificación CAST, a menos que se indique algo distinto):

  • Conversión del tipo diferenciado DT a su tipo de datos fuente S
  • Conversión del tipo de datos fuente S del tipo diferenciado DT al tipo diferenciado DT
  • Conversión del tipo diferenciado DT al mismo tipo diferenciado DT
  • Conversión de un tipo de datos A al tipo diferenciado DT donde A se puede promocionar al tipo de datos fuente S del tipo diferenciado DT
  • Conversión de INTEGER a un tipo diferenciado DT con un tipo de datos fuente SMALLINT
  • Conversión de DOUBLE a un tipo diferenciado DT con un tipo de datos fuente REAL
  • Conversión de DECFLOAT a un tipo diferenciado DT con un tipo de datos fuente de DECFLOAT
  • Conversión de VARBINARY a un tipo diferenciado DT con un tipo de datos de origen BINARY
  • Conversión de VARCHAR a un tipo diferenciado DT con un tipo de datos fuente CHAR
  • Conversión de VARGRAPHIC a un tipo diferenciado DT con un tipo de datos fuente GRAPHIC
  • Para una base de datos Unicode, conversión de VARCHAR o VARGRAPHIC a un tipo diferenciado DT con un tipo de datos fuente CHAR o GRAPHIC
  • Conversión de un tipo diferenciado DT con un tipo de datos fuente S a XML utilizando la especificación XMLCAST
  • Conversión de un XML a un tipo diferenciado DT con un tipo de datos fuente de cualquier tipo de datos incorporado, utilizando la especificación XMLCAST, en función del tipo de datos de esquema XML del valor XML

Para las conversiones que implican un tipo diferenciado con tipo no firme como destino, la conversión desde el tipo de datos debe poder convertir en el tipo de fuente del tipo diferenciado con tipo no firme, y las restricciones de tipo de datos deben evaluarse como verdaderas o desconocidas para el valor. El único contexto en el que un operando se convierte implícitamente en un tipo diferenciado con tipo no firme es cuando se asigna un operando fuente a un destino con un tipo de datos que es un tipo diferenciado con tipo no firme.

Los tipos de datos FOR BIT DATA no se pueden convertir a CLOB.

En las conversiones que implican un tipo de matriz como destino, el tipo de datos de los elementos del valor de la matriz fuente debe poderse convertir al tipo de datos de los elementos de datos de la matriz de destino (SQLSTATE 42846). Si el tipo de matriz de destino es una matriz común, el valor de la matriz fuente debe ser una matriz común (SQLSTATE 42821) y la cardinalidad del valor de la matriz fuente debe ser igual o menor que la cardinalidad máxima del tipo de datos de la matriz de destino (SQLSTATE 2202F). Si el tipo de matriz de destino es una matriz asociativa, el tipo de datos del índice del valor de matriz fuente se debe poder convertir al tipo de datos del índice del tipo de matriz de destino. Los valores de tipo array definido por el usuario sólo se pueden convertir al mismo tipo de matriz definido por el usuario (SQLSTATE 42846).

Un tipo de cursor no puede ser el tipo de datos fuente ni el tipo de datos de destino de una especificación CAST, excepto para convertir un marcador de parámetro en un tipo de cursor.

En las conversiones que implican un tipo de fila como destino, el grado de la expresión de valor de la fila fuente debe coincidir con el grado del tipo de fila de destino, y cada campo de la expresión de valor de la fila fuente debe poderse convertir al campo de destino correspondiente. Los valores de tipo de fila definidos por el usuario sólo se pueden convertir a otro tipo de fila definido por el usuario que tenga el mismo nombre (SQLSTATE 42846).

No es posible convertir un valor de tipo estructurado en algo diferente. Un tipo estructurado ST no necesita convertirse en uno de sus supertipos, porque todos los métodos de los supertipos de ST pueden aplicarse a ST. Si la operación requerida sólo puede aplicarse a un subtipo de ST, utilice la expresión de tratamiento de subtipos para tratar a ST como a uno de sus subtipos.

Cuando un tipo de datos definido por el usuario e implicado en una conversión no está calificado por un nombre de esquema, se utiliza la vía de acceso de SQL para buscar el primer esquema que incluya el tipo de datos definido por el usuario con este nombre.

Se da soporte a las siguientes conversiones donde intervienen tipos de referencia:
  • Conversión del tipo de referencia RT a su tipo de datos de representación S
  • Conversión del tipo de datos de representación S de un tipo de referencia RT al tipo de referencia RT
  • Conversión de un tipo de referencia RT con un tipo de destino T a un tipo de referencia RS con un tipo de destino S donde S es un supertipo de T.
  • Conversión de un tipo de datos A en un tipo de referencia RT donde A se puede promocionar al tipo de datos de representación S del tipo de referencia RT.

Cuando el tipo de destino de un tipo de datos de referencia implicado en una conversión no está calificado por un nombre de esquema, se utiliza la vía de acceso de SQL para buscar el primer esquema que incluya el tipo de datos definido por el usuario con este nombre.

Tabla 1. Conversiones soportadas entre tipos de datos internos
Tipo de datos fuente Tipo de datos de destino  
S
M
A
L
L
I
N
T
I
N
T
E
G
E
R
B
I
G
I
N
T
D
E
C
I
M
A
L
R
E
A
L
D
O
U
B
L
E
D
E
C
F
L
O
A
T
C
H
A
R
C
H
A
R

F
B
D2
V
A
R
C
H
A
R
V
A
R
C
H
A
R

F
B
D2
C
L
O
B
G
R
A
P
H
I
C
V
A
R
G
R
A
P
H
I
C
D
B
C
L
O
B
B
I
N
A
R
S
V
A
R
B
I
N
A
R
S
B
L
O
B
D
A
T
E
T
I
M
E
T
I
M
E
S
T
A
M
P
X
M
L
B
O
O
L
E
A
N
SMALLINT S S S S S S S S S S S - S1 S1 - - - - - - - S3 Y
INTEGER S S S S S S S S S S S - S1 S1 - - - - - - - S3 Y
BIGINT S S S S S S S S S S S - S1 S1 - - - - - - - S3 Y
DECIMAL S S S S S S S S S S S - S1 S1 - - - - - - - S3 -
REAL S S S S S S S S S S S - S1 S1 - - - - - - - S3 -
DOUBLE S S S S S S S S S S S - S1 S1 - - - - - - - S3 -
DECFLOAT S S S S S S S S S S S - S1 S1 - - - - - - - - -
CHAR S S S S S S S S S S S S S S S1 S S S S S S S4 Y
CHAR FOR BIT DATA S S S S S S S S S S S - - - - S S S S S S S3 -
VARCHAR S S S S S S S S S S S S S S S1 S S S S S S S4 Y
VARCHAR FOR BIT DATA S S S S S S S S S S S - - - - S S S S S S S3 -
CLOB - - - - - - - S - S - S S1 S1 S1 S S S - - - S4 -
GRAPHIC S1 S1 S1 S1 S1 S1 S1 S1 - S1 - S1 S S S S S S S1 S1 S1 S3 Y1
VARGRAPHIC S1 S1 S1 S1 S1 S1 S1 S1 - S1 - S1 S S S S S S S1 S1 S1 S3 Y1
DBCLOB - - - - - - - S1 - S1 - S1 S S S S S S - - - S3 -
BINARY - - - - - - - - S - S - - - - S S S - - - - -
VARBINARY - - - - - - - - S - S - - - - S S S - - - - -
BLOB - - - - - - - - S - S - - - - S S S - - - S4 -
DATE - S S S - - - S S S S - S1 S1 - - - - S - S S3 -
TIME - S S S - - - S S S S - S1 S1 - - - - - S - S3 -
TIMESTAMP - - S S - - - S S S S - S1 S1 - - - - S S S S3 -
XML S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 S5 - - S5 S5 S5 S5 S -
BOOLEAN Y Y Y - - - - Y - Y - - Y1 Y1 - - - - - - - - Y
Notas
  • Consulte la descripción que precede a la tabla para obtener información acerca de las conversiones que reciben soporte en las que intervienen tipos definidos por el usuario y tipos de referencia.
  • No es posible convertir un valor de tipo estructurado en algo diferente.
  • Los tipos de datos LONG VARCHAR y LONG VARGRAPHIC siguen estando soportados pero han quedado obsoletos, no son recomendables y se pueden eliminar en un release futuro.

1 Conversión sólo soportada para bases de datos Unicode.

2 FOR BIT DATA

3 La conversión sólo se puede efectuar utilizando XMLCAST.

4 Se procesa implícitamente una función XMLPARSE para convertir una serie a XML al asignarse (INSERT o UPDATE) una seria a una columna XML. La serie tiene que ser un documento XML bien formado para que la asignación tenga éxito.

5 La conversión sólo se puede efectuar utilizando XMLCAST y depende del tipo de datos del esquema XML subyacente del valor XML. Para obtener detalles, consulte XMLCAST.

6 Un tipo de cursor no puede ser el tipo de datos fuente ni el tipo de datos de destino de una especificación CAST, excepto para convertir un marcador de parámetro en un tipo de cursor.

En la Tabla 2 se indica dónde buscar información acerca de las normas que tienen aplicación al realizar la conversión en los tipos de datos de destino identificados.

Tabla 2. Normas para convertir a un tipo de datos
Tipo de datos de destino Normas
SMALLINT Función escalar SMALLINT.
INTEGER Función escalar INTEGER.
BIGINT Función escalar BIGINT.
DECIMAL Función escalar DECIMAL o DEC
NUMERIC Función escalar DECIMAL o DEC
REAL Función escalar REAL
DOUBLE Función escalar DOUBLE_PRECISION o DOUBLE
DECFLOAT Función escalar DECFLOAT
CHAR Función escalar CHAR
VARCHAR Función escalar VARCHAR
CLOB Función escalar CLOB
GRAPHIC Función escalar GRAPHIC
VARGRAPHIC Función escalar VARGRAPHIC
DBCLOB Función escalar DBCLOB
BINARY Función escalar BINARY
VARBINARY Función escalar VARBINARY
BLOB Función escalar BLOB
DATE Función escalar DATE
TIME Función escalar TIME
TIMESTAMP Si el tipo de origen es una serie de caracteres, consulte Función escalar TIMESTAMP, donde se especifica un operando. Si el tipo de datos fuente es DATE, la indicación de fecha y hora estará compuesta por la fecha y hora especificadas de 00:00:00.
BOOLEAN Función escalar BOOLEAN

Conversiones de valores que no son XML a valores XML

Tabla 3. Conversiones soportadas desde valores que no son XML a valores XML
Tipo de datos fuente Tipo de datos de destino
XML Tipo de esquema XML obtenido
SMALLINT S xs:short
INTEGER S xs:int
BIGINT S xs:long
DECIMAL o NUMERIC S xs:decimal
REAL S xs:float
DOUBLE S xs:double
DECFLOAT N -
CHAR S xs:string
VARCHAR S xs:string
CLOB S xs:string
GRAPHIC S xs:string
VARGRAPHIC S xs:string
DBCLOB S xs:string
DATE S xs:date
TIME S xs:time
TIMESTAMP S xs:dateTime1
BLOB S xs:base64Binary
BOOLEAN S xs:boolean
Tipo de caracteres FOR BIT DATA S xs:base64Binary
tipo diferenciado   utilice esta tabla con el tipo fuente del tipo diferenciado
Notas

1 El tipo de datos fuente TIMESTAMP da soporte a la precisión de indicación de fecha y hora de 0 a 12. La precisión máxima de los segundos fraccionarios de xs:dateTime es 6. Si la precisión de la indicación de fecha y hora de un tipo de datos fuente TIMESTAMP sobrepasa 6, el valor se trunca cuando se convierte a xs:dateTime.

Los tipos de datos LONG VARCHAR y LONG VARGRAPHIC siguen estando soportados pero han quedado obsoletos, no son recomendables y se pueden eliminar en un release futuro.

Cuando los valores de una serie de caracteres se convierten a valores XML, el valor elemental xs:string obtenido no puede contener caracteres XML ilegales (SQLSTATE 0N002). Si la serie de caracteres de entrada no está en Unicode, dichos caracteres se convertirán a Unicode.

La conversión a tipos binarios de SQL da como resultado valores XQuery elementales con el tipo xs:base64Binary.

Conversión de valores XML a valores que no son XML

Un XMLCAST desde un valor XML a un valor que no es XML se puede describir como de dos conversiones: una conversión XQuery que convierte el valor XML fuente a un tipo XQuery correspondiente al tipo de destino SQL, seguido de una conversión desde el tipo XQuery correspondiente al tipo SQL real.

Se considera que XMLCAST está soportado si el tipo de destino tiene un tipo de destino XQuery correspondiente soportado y si hay una conversión XQuery soportada del tipo de valor fuente al tipo de destino XQuery correspondiente. El tipo de destino utilizado en la conversión XQuery está basado en el tipo de destino XQuery correspondiente y puede contener restricciones adicionales.

La tabla siguiente lista los tipos XQuery que se obtienen de dicha conversión.

Tabla 4. Conversiones soportadas de valores XML a valores que no son XML
Tipo de datos de destino Tipo de datos fuente
XML Tipo de destino XQuery correspondiente
SMALLINT S xs:short
INTEGER S xs:int
BIGINT S xs:long
DECIMAL o NUMERIC S xs:decimal
REAL S xs:float
DOUBLE S xs:double
DECFLOAT S sin tipo coincidente1
CHAR S xs:string
VARCHAR S xs:string
CLOB S xs:string
GRAPHIC S xs:string
VARGRAPHIC S xs:string
DBCLOB S xs:string
DATE S xs:date
TIME (sin huso horario) S xs:time
TIMESTAMP (sin huso horario) S xs:dateTime2
BLOB S xs:base64Binary
BOOLEAN S xs:boolean
CHAR FOR BIT DATA N no convertible
VARCHAR FOR BIT DATA S xs:base64Binary
tipo diferenciado   utilice esta tabla con el tipo fuente del tipo diferenciado
fila, referencia, tipo de datos estructurado o abstracto (ADT), otros N no convertible
Notas
1 Se soporta XML Schema 1.0, que no proporciona un tipo de esquema XML coincidente para un DECFLOAT. El proceso del paso de conversión de XQuery de XMLCAST se maneja del siguiente modo:
  • Si el valor fuente se escribe con un tipo numérico de esquema XML, utilice dicho tipo numérico.
  • Si el valor fuente se escribe con un tipo de esquema XML xs:boolean, utilice xs:double.
  • En caso contrario, utilice xs:string con comprobación adicional para un formato numérico válido.

2 la precisión máxima de los segundos fraccionarios de xs:dateTime es 6. El tipo de datos fuente TIMESTAMP da soporte a la precisión de indicación de fecha y hora de 0 a 12. Si la precisión de la indicación de fecha y hora de un tipo de datos de destino TIMESTAMP es menor que 6, el valor se trunca cuando se convierte de xs:dateTime. Si la precisión de la indicación de fecha y hora de un tipo de datos de destino TIMESTAMP sobrepasa 6, el valor se rellena con ceros cuando se convierte de xs:dateTime.

En los casos de restricción siguientes, se utiliza un tipo de datos del esquema XML derivado por restricción, como tipo de datos de destino para la conversión XQuery.
  • Los valores XML que se deben convertir en tipos de serie distintos de CHAR y VARCHAR deben ajustarse dentro de los límites de longitud de esos tipos de datos sin truncar ningún carácter o byte. El nombre utilizado para el tipo de esquema XML derivado es el nombre del tipo SQL en mayúsculas seguido de un carácter subrayado y la longitud máxima de la serie; por ejemplo, CLOB_1048576 si el tipo de datos de destino XMLCAST es CLOB(1M).

    Si un valor XML se convierte en un tipo CHAR o VARCHAR de tamaño demasiado pequeño para contener todos los datos, los datos se truncan para que quepa el tipo de datos especificado y no se devuelve ningún error. Si se trunca algún carácter que no sea un carácter en blanco, se devuelve un aviso (SQLSTATE 01004). Si el truncamiento del valor provoca que se trunque un carácter de varios bytes, se elimina todo el carácter de varios bytes. Por lo tanto, en algunos casos, los truncamientos pueden generar una serie más corta que la esperada. Por ejemplo, el carácter ñ, se representa en UTF-8 mediante 2 bytes, 'C3 B1'. Cuando este carácter se convierte como VARCHAR(1), la truncación de 'C3 B1' en 1 byte dejaría un carácter parcial de 'C3'. Este carácter parcial, 'C3', también se elimina y, por lo tanto, el resultado final es una serie vacía.

  • Los valores XML que se tienen que convertir en valores DECIMAL no deben tener más de (precisión - escala) dígitos antes de la coma decimal; los dígitos de más tras la coma decimal después de la escala se truncan. El nombre utilizado para el tipo de esquema XML derivado es DECIMAL_precisión_escala, donde precisión es la precisión de los tipos de datos SQL de destino y escala es la escala de los tipos de datos SQL de destino; por ejemplo, DECIMAL_9_2 si el tipo de datos de destino XMLCAST es DECIMAL(9,2).
  • Los valores XML que deben convertirse a valores TIME no pueden contener un componente de segundos con dígitos que no sean cero después de la coma decimal. El nombre utilizado para el tipo de esquema XML derivado es TIME.

El nombre del tipo de esquema XML derivado sólo aparece en un mensaje si un valor XML no cumple alguna de estas restricciones. Este nombre de tipo ayuda a comprender el mensaje de error y no corresponde a ningún tipo de XQuery definido. Si el valor de entrada no cumple el tipo de base del tipo de esquema XML derivado (el tipo de destino XQuery correspondiente), el mensaje de error puede indicar en su lugar este tipo. Dado que este formato de nombre de tipo de esquema XML puede cambiar en el futuro, no debería utilizarse como interfaz de programación.

Antes de que la conversión XQuery procese un valor XML, se eliminarán todos los nodos de documento de la secuencia y cada hijo directo de nodo del documento eliminado se convertirá en un elemento de la secuencia. Si el nodo del documento tiene varios nodos hijo directos, la secuencia revisada tendrá más elementos que la secuencia original. El valor XML sin ningún tipo de nodo de documento se atomiza mediante la función XQuery fn:data y se utiliza el valor de secuencia atomizada resultante en la conversión XQuery. Si la secuencia atomizada es una secuencia vacía, la conversión devuelve un valor nulo sin ningún proceso posterior. Si el valor de la secuencia atomizada contiene varios elementos, se devolverá un error (SQLSTATE 10507).

Si el tipo de destino de XMLCAST es el tipo de datos DATE, TIME o TIMESTAMP de SQL, el valor XML obtenido de la conversión XQuery también se ajustará a UTC y se eliminará el componente de huso horario del valor.

Cuando el valor del tipo de destino XQuery correspondiente se convierte al tipo de destino SQL; los tipos de datos XML binarios como xs:base64Binary o xs:hexBinary, se convierten del formato de carácter a datos binarios reales.

Si un valor xs:double o xs:float de INF, -INF o NaN se convierte (mediante XMLCAST) a un valor DOUBLE o REAL de tipo de datos SQL, se devuelve un error (SQLSTATE 22003). Un valor xs:double o xs:float de -0 se convierte a +0.

El tipo de destino puede ser un tipo diferenciado definido por el usuario, si el operando fuente no es un tipo diferenciado definido por el usuario. En dicho caso, el valor fuente se convierte en el tipo fuente del tipo diferenciado definido por el usuario (es decir, el tipo de destino) mediante la especificación XMLCAST y, a continuación, este valor se convierte en el tipo diferenciado definido por el usuario mediante la especificación CAST.

En una base de datos no Unicode, la conversión de un valor XML a un tipo de destino no XML implica la conversión de página de códigos de un formato UTF-8 interno a la página de códigos de la base de datos. La conversión dará como resultado la entrada de los caracteres de sustitución en caso de que algún elemento de código del valor XML no esté presente en la página de códigos de la base de datos.