The uMySQL driver supports various std::
types for both input and output directions and some userver-specific types.
The driver also supports aggregates of supported types as input or output parameters:
whenever there is a row-wise mapping to/from T
, T
is expected to be an SimpleAggregate, that is an aggregate type without base classes, const fields, references, or C arrays.
The following table shows how types are mapped from C++ to MySQL types.
Input C++ types | Corresponding MySQLType |
---|---|
std::uint8_t /std::int8_t | TINYINT |
std::uint16_t /std::int16_t | SMALLINT |
std::uint32_t /std::int32_t | INT |
std::uint64_t /std::int64_t | BIGINT |
float | FLOAT |
double | DOUBLE |
std::string | TEXT |
std::string_view | TEXT |
const char * | TEXT |
std::chrono::system_clock::timepoint | TIMESTAMP |
storages::mysql::Date | DATE |
storages::mysql::DateTime | DATETIME |
formats::json::Value | TEXT |
decimal64::Decimal<Prec, Policy> | DECIMAL |
The driver also supports std::optional<T> for every supported type, and that maps to either NULL or exactly as T does, depending on whether is optional engaged or not.
Mapping MySQL types to C++ types is a more complicated matter:
Is column NULLABLE | Is type optional | behavior |
---|---|---|
true | true | allowed |
true | false | UINVARIANT |
false | true | allowed |
false | false | allowed |
DECIMAL
will throw at extraction stage if precision/rounding policy of corresponding decimal::Decimal64<Prec, Policy>
is violated.DATE
or DATETIME
not within TIMEPOINT
range into std::chrono::system_clock::timepoint
will throw at extraction stage. The decision was made to allow this conversion, since it might be very convenient to use, but in general this conversion is narrowing.UINVARIANT
, however widening numeric conversions are allowed, this check happens before actual extraction. You can see to what C++ types MySQL types can map in the following table:Output C++ type | Allowed MySQL types |
---|---|
std::uint8_t | TINYINT UNSIGNED NOT NULL |
std::int8_t | TINYINT NOT NULL |
std::optional<std::uint8_t> | TINYINT UNSIGNED NOT NULL , TINYINT UNSIGNED |
std::optional<std::int8_t> | TINYINT NOT NULL , TINYINT |
std::uint16_t /std::int16_t /optional | SMALLINT + all types above, with respect to signed/unsigned and NULL/NOT NULL |
std::uint32_t /std::int32_t /optional | INT , INT24 + all types above, with respect to signed/unsigned and NULL/NOT NULL |
std::uint64_t /std::int64_t /optional | BIGINT + all types above, with respect to signed/unsigned and NULL/NOT NULL |
float | FLOAT NOT NULL |
std::optional<float> | FLOAT NOT NULL , FLOAT |
double | DOUBLE NOT NULL , FLOAT NOT NULL |
std::optional<double> | DOUBLE , DOUBLE NOT NULL , FLOAT , FLOAT NOT NULL |
std::string/optional | CHAR , BINARY , VARCHAR , VARBINARY , TINYBLOB , TINYTEXT , BLOB , TEXT , MEDIUMBLOB , MEDIUMTEXT , LONGBLOB , LONGTEXT , with respect to NULL/NOT NULL |
std::chrono::system_clock::timepoint/optional | TIMEPOINT , DATETIME , DATE , with respect to NULL/NOT NULL |
storages::mysql::Date + optional | DATE , with respect to NULL/NOT NULL |
storages::mysql::DateTime +optional | DATETIME , with respect to NULL/NOT NULL |
formats::json::Value + optional | JSON , with respect to NULL/NOT NULL |
decimal64::Decimal<Prec, Policy> + optional | DECIMAL , with respect to NULL/NOT NULL |