Tipos en MySql/MariaDb

Algunas características peculiares de los tipos de datos en MySql/MariaDB y su uso en Rust usando la librearía Sqlx.

Chrono

Para usar los tipos Timestamp, Datetime, Time y Date podemos usar la librería chrono.

  • Para Timestamp usamos chrono::DateTime<chrono::Utc>. El problema es que esta representa siempre añadiendo el sufijo UTC, pero este es incorrecto, así que tenemos que eliminarlo. Ninguna otra representación de las posibles funciona, así que usando .to_string() es suficiente. En MySql/MariaDb Timestamp siempre es Utc, así que la hora que representa es en Utc+00:00. De su documentación:

    The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of ‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC.

De hecho en este extracto se ve otro problema: si usamos DateTime::<Utc>::default(), crea una fecha ‘1970-01-01 00:00:00’, no válida porque solo se puede a partir del timestamp 1, que se corresponde con ‘1970-01-01 00:00:01’.

Bugs

SQLx da el tipo de dato en un campo type_info(). En su código se puede ver que la representación de JSON y SET es:

ColumnType::Set => "SET",
ColumnType::Json => "JSON",

Por lo que se podría pensar que cuando un tipo es JSON o SET volverán con esos ColumnType::Set y ColumnType::Json respectivamente. Pero no, nos devuelve CHAR para el primero y TEXT para el segundo (versión “0.7.4”). Puede ser que sea algún problema con los flags, que haga falta activar alguna feature para que funcione debidamente, etc., pero no he logrado el tipo correcto. La tabla que he usado para probar esto es:

CREATE TABLE example_data_types (
    data_enum ENUM('value1', 'value2', 'value3'),
    data_set SET('option1', 'option2', 'option3'),
    data_json JSON,
);

INSERT INTO example_data_types (data_enum, data_set, data_json)
VALUES ('value1', 'option1,option2', '{"key": "value"}'),
       ('value3', 'option2', '{"anotherKey": "anotherValue"}');

que cumple con lo que se puede leer en la documentación, tanto para SET como para JSON, pero me parsea los valores como los tipos comentados anteriormente.

Realmente va bien para lo que estoy haciendo, pero si en algún momento corrigen me dará error.

Geometry

Ahora mismo (240523) no puedo parsear de forma directa. Tiene que ser el usuario quien lo haga con la petición correspondiente como ST_AsGeometry, etc.

Json

Cuando creo con JSON, solamente puedo introducir valores que son en efecto json válidos. Pero no puedo generarlos porque me devuelve, si no hacemos nada especial, que es un tipo LONGTEXT.