Tipos de datos soportados

Esta sección describe los tipos de datos admitidos en Cytomic Orion y las consideraciones especiales al utilizarlos.

Enteros (INT y UINT)

Números enteros de tamaño fijo, con o sin signo.

Rango de enteros con signo
  • Int8 - [-128 : 127]

  • Int16 - [-32768 : 32767]

  • Int32 - [-2147483648 : 2147483647]

  • Int64 - [-9223372036854775808 : 9223372036854775807]

Rango de enteros sin signo
  • UInt8 - [0 : 255]

  • UInt16 - [0 : 65535]

  • UInt32 - [0 : 4294967295]

  • UInt64 - [0 : 18446744073709551615]

Decimales (DECIMALX)

Números de punto fijo que mantienen la precisión durante las operaciones de suma, resta y multiplicación. Para la división, los dígitos menos significativos se descartan (no se redondean).

Parámetros
  • P - Precisión. Rango válido: [1: 38]. Determina cuántos dígitos decimales puede tener el número incluyendo la parte decimal.

  • S - escala. Rango válido: [0: P]. Determina cuántos dígitos decimales puede tener la parte decimal.

Rangos de valores decimales
  • Decimal32 (S) - (-1 * 10 ^ (9 - S), 1 * 10 ^ (9 - S))

  • Decimal64 (S) - (-1 * 10 ^ (18 - S), 1 * 10 ^ (18 - S))

  • Decimal128 (S) - (-1 * 10 ^ (38 - S), 1 * 10 ^ (38 - S))

Por ejemplo, Decimal32 (4) puede contener números desde -99999.9999 hasta 99999.9999 en incrementos de 0.0001.

Representación interna

Los datos internos se representan como enteros con signo con el número de bits apropiado. Los rangos de valores reales que se pueden almacenar en memoria son algo más grandes que los especificados anteriormente, los cuales verifican únicamente en operaciones de conversión desde una cadena.

Debido a que CPUs modernas no admiten los enteros de 128 bits de forma nativa, se emulan las operaciones en Decimal128. Debido a esto, Decimal128 funciona significativamente más lento que Decimal32 / Decimal64.

Operaciones y tipo de resultado

Las operaciones binarias en decimal dan como resultado un tipo de resultado más amplio (con cualquier orden de argumentos).

  • Decimal64 (S1) Decimal32 (S2) -> Decimal64 (S)

  • Decimal128 (S1) Decimal32 (S2) -> Decimal128 (S)

  • Decimal128 (S1) Decimal64 (S2) -> Decimal128 (S)

Reglas para escalado:

  • sumar, restar: S = max (S1, S2)

  • Multiplicación: S = S1 + S2.

  • dividir: S = S1.

Para operaciones similares entre decimal y enteros, el resultado es el decimal del mismo tamaño que el argumento.

Las operaciones entre Decimal y Float32 / Float64 no están definidas. Si realmente son necesarias puedes convertir explícitamente uno de los argumentos usando toDecimal32, toDecimal64, toDecimal128 o toFloat32, toFloat64. Ten en cuenta que el resultado perderá precisión y la conversión de tipos es una operación costosa.

Algunas funciones en Decimal devuelven el resultado como Float64 (por ejemplo, var o stddev). Los cálculos intermedios aún se pueden realizar en decimal, lo que puede llevar a resultados diferentes entre las entradas en coma flotante y decimal con los mismos valores.

Controles de desbordamiento

Durante los cálculos en decimal se pueden producir un desbordamiento de enteros. Los dígitos de más en la parte decimal se descartan (no se redondean). Los dígitos de más en la parte entera darán lugar a una excepción.

Los controles de desbordamiento provocan una ralentización en la ejecución de las operaciones. Las comprobaciones de desbordamiento no solo se producen en operaciones aritméticas sino también en la comparación de valores:

Booleanos (UINT8)

No hay un tipo independiente para valores booleanos, se utiliza el tipo UInt8 restringido a los valores 0 y 1.

Cadenas de caracteres (STRING)

String representa una cadena de caracteres de longitud arbitraria sin límite. El valor puede contener un conjunto arbitrario de bytes, incluidos bytes nulos. Este tipo de dato reemplaza los tipos VARCHAR, BLOB, CLOB y otros equivalentes de otros DBMS.

Codificaciones

Cytomic Orion no soporta el concepto de codificaciones. Las cadenas pueden contener un conjunto arbitrario de bytes, que se almacenan y reproducen tal cual. Si necesita almacenar textos, se recomendamos utilizar la codificación UTF-8. Dado que la consola de analisi soporta UTF-8 se pueden leer y escribir sus valores sin hacer conversiones. De manera similar, ciertas funciones para trabajar con cadenas tienen variaciones que funcionan bajo el supuesto de que la cadena contiene un conjunto de bytes que representan un texto codificado en UTF-8. Por ejemplo, la función length calcula la longitud de la cadena en bytes, mientras que la función lengthUTF8 calcula la longitud de la cadena en puntos de código Unicode, asumiendo que el valor está codificado en UTF-8.

Cadenas de caracteres fijas (FIXEDSTRING)

FixedString(N) es una cadena de longitud fija de N bytes (ni caracteres ni puntos de código).

Para declarar una columna del tipo FixedString usa la siguiente sintaxis:

<column_name> FixedString (N)

Donde N es un número natural.

El tipo FixedString es eficiente cuando los datos tienen una la longitud de exactamente N bytes. En todos los demás casos, es probable que el rendimiento caiga.

Ejemplos de los valores que se pueden almacenar de manera eficiente en columnas de tipo FixedString:

  • Representación binaria de direcciones IP (FixedString (16) para IPv6).

  • Códigos de idioma (ru_RU, en_US ...).

  • Códigos de moneda (USD, RUB ...).

  • Representación binaria de hashes (FixedString (16) para MD5, FixedString (32) para SHA256).

Para almacenar valores UUID, use el tipo de datos UUID.

Al insertar datos, Cytomic Orion ejecuta las siguientes tareas:

  • Completa la cadena con bytes nulos si la cadena contiene menos de N bytes.

  • Lanza la excepción Too large value for FixedString(N) si la cadena contiene más de N bytes.

Al seleccionar los datos Cytomic Orion no elimina los bytes nulos al final de la cadena. Si usa la cláusula WHERE debes agregar bytes nulos manualmente para que coincida con el valor de FixedString. Este comportamiento difiere del comportamiento de MySQL para el tipo CHAR (donde las cadenas se rellenan con espacios y los espacios se eliminan para la salida).

Ten en cuenta que la longitud del valor FixedString (N) es constante. La función de longitud devuelve N incluso si el valor de FixedString (N) se llena solo con bytes nulos, pero la función vacía devuelve 1 en este caso.

Fecha (DATE)

Date almacena en dos bytes el número de días de la fecha desde 1970-01-01. Permite almacenar valores desde el comienzo de la época de Unix hasta el umbral superior definido en el año 2105. El valor mínimo se muestra como 0000-00-00.

La fecha se almacena sin la zona horaria.

Fecha y hora (DATETIME)

DateTime se almacena en cuatro bytes como una marca de tiempo Unix y permite almacenar valores en el mismo rango que el definido para el tipo Date. El tiempo se almacena con una precisión de hasta un segundo (sin segundos bisiestos).

Zonas horarias

El tipo DateTime se convierte de texto (dividido en sus partes) a binario y viceversa utilizando la zona horaria del sistema en el momento en que se inicia el servidor. En formato de texto la información sobre el horario de verano se pierde.

De forma predeterminada el cliente cambia a la zona horaria del servidor cuando se conecta. Por lo tanto, cuando trabaje con una fecha de texto (por ejemplo, al guardar volcados de texto), tenga en cuenta que puede haber ambigüedades durante los cambios en el horario de verano y puede haber problemas para hacer coincidir los datos si la zona horaria cambia.

Nullable

Nullable (TypeName) permite almacenar una marcador especial (NULL) que representa a un valor nulo junto con los valores normales permitidos por TypeName. Por ejemplo, una columna de tipo Nullable (Int8) puede almacenar valores de tipo Int8, y las filas que no tienen un valor almacenarán NULL.