MySQL
Supported data types
What each .NET type is stored as in MySQL, and what each MySQL type reads back as.
Writing: .NET to the database
The values Create and Update accept, and what each column stores.
| .NET value | Column | Stored as |
|---|---|---|
string |
VARCHAR(n), CHAR(n), TEXT |
as written (CHAR(n) pads with spaces when it stores and drops them when it reads) |
byte / short / int / long |
TINYINT / SMALLINT / INT / BIGINT |
100 / 32000 / 2000000000 / 9000000000000 |
uint |
INT UNSIGNED |
4000000000 |
decimal |
DECIMAL(p, s) |
12345.678901 |
float / double |
FLOAT / DOUBLE |
3.25 / 2.718281828459045 (a FLOAT keeps about six significant digits) |
bool |
BOOLEAN (TINYINT(1)) |
1 |
Guid |
CHAR(36) |
6f9619ff-8b86-d011-b42d-00c04fc964ff (lower case); to a BINARY(16) column as its 16 bytes when the schema is preloaded |
DateTimeOffset |
TIMESTAMP(6) |
the moment, stored as UTC: 22:30 +08:00 is 14:30:00.000000 (the offset isn't kept) |
DateTime |
DATETIME(6), DATETIME |
as written: 2026-11-07 09:00:00.000000 (a plain DATETIME rounds to the second) |
DateOnly / TimeOnly |
DATE / TIME(6) |
2026-11-07 / 17:45:30.000000 |
byte[], ArxBytea |
BLOB, LONGBLOB, BINARY(n) |
0xCAFE |
ArxJsonB |
JSON |
MySQL's own form of the document (invalid JSON: ARX4003) |
ArxEntityReference |
the lookup column | the referenced id |
ArxSelectionSetValue |
the set's column (an ENUM or SET column included) |
the option's code |
null |
any | NULL |
sbyte / ushort / uint / ulong |
converted to SMALLINT / INT / BIGINT / DECIMAL |
-100 / 65000 / 4000000000 / 18446744073709551615 |
char |
text | X |
a plain enum |
refused (ARX1007) | write (int)value or value.ToString(), or use a selection set, which stores the code its set declares |
DateTime with Kind Utc |
TIMESTAMP(6) |
the moment |
DateTime with Kind Local |
DATETIME(6), TIMESTAMP(6) |
converted to UTC first |
Refused before anything is sent: any other type (ARX1007 UnsupportedValueType: write uri.ToString() rather than a
Uri); arrays (ARX8001: MySQL has no array columns, so store a list as delimited text, JSON or rows of its own);
NaN and the infinities (ARX4001). A TIME column also holds durations, up to ±838 hours (a TimeSpan).
With the column types preloaded (ArxPreLoadMode.DataTypes), a number with a fraction written to a whole-number column is refused before MySQL (ARX4001 ValueOutOfRange) on a create, an update and a write by a filter, where MySQL would round it (7.9 stored as 8); a condition in a read (qty < 7.5) isn't refused. A NaN or an infinity written to a declared decimal column is refused the same way.
MySQL converts some values itself: "42" into an INT, 2.5 into an INT by rounding (half away from zero), a
year-first string such as '2026-11-07' into a DATE. Text that isn't a number, and a date string in any other order,
are errors (ARX4003). A preload with column types (ArxPreLoadMode.DataTypes) refuses a value of the wrong type before
the database. RealCase2_EveryDataType writes every row of this table and prints what MySQL stored.
Dates and times
| You have | Use | Column |
|---|---|---|
| A moment (an order was placed) | DateTimeOffset, or DateTime with Kind Utc |
TIMESTAMP(6) (1970 to 2038) |
| A moment, past 2038 | DateTime with Kind Utc |
DATETIME(6) (store UTC, read it back as UTC) |
| A wall-clock time with no zone | DateTime with Kind Unspecified |
DATETIME(6) |
| A calendar date | DateOnly |
DATE |
| A time of day | TimeOnly |
TIME(6) |
| A duration | a number (seconds, minutes), or a TimeSpan up to 838 hours |
INT, BIGINT, TIME |
A TIMESTAMP is converted from the session's time zone to UTC when stored and back when read: ARX's sessions are UTC,
so the instant is stored and read as it is. A DATETIME stores the clock time it is given: a DateTime with Kind Unspecified or Utc as it is, and one with Kind Local (DateTime.Now) converted to UTC first, as every ARX write does with a local time. It reads back with no zone, so use Kind Unspecified for a wall-clock time and Utc for a moment, never Local. Fractional
seconds are kept only when the column declares them ((6)); MySQL rounds to the column's precision. Refused:
default(DateTime) (ARX1013: it means "not set"; use null), and a date string MySQL can't read (ARX4003: ARX never
parses strings as dates). Full rules: Data types.
Reading: the database to .NET
What Retrieve and RetrieveMultiple give back for each column.
| MySQL column | Reads back as | Notes |
|---|---|---|
VARCHAR(n), CHAR(n), TEXT |
string |
CHAR(n) drops its padding spaces when read; "" stays "" |
TINYINT / SMALLINT / INT / BIGINT |
sbyte / short / int / long |
TINYINT UNSIGNED is a byte |
INT UNSIGNED, BIGINT UNSIGNED |
uint, ulong |
|
DECIMAL(p, s) |
decimal |
More than 28 significant digits: ARX4001 ValueOutOfRange |
FLOAT / DOUBLE |
float / double |
|
BOOLEAN (TINYINT(1)) |
bool |
|
CHAR(36) |
Guid |
Text that isn't a Guid: ARX5003 SchemaMismatch |
BINARY(16) |
byte[]; a Guid for a declared Guid id |
|
TIMESTAMP |
DateTime, Kind Utc |
The instant, read in ARX's UTC session (on your own connection, in its session's zone) |
DATETIME |
DateTime, Kind Unspecified |
The clock time as stored: MySQL keeps no zone |
DATE / TIME |
DateOnly / TimeOnly |
A TIME past 24 hours or below zero is a TimeSpan |
BLOB, LONGBLOB, BINARY(n) |
byte[] |
|
JSON |
string |
MySQL's own form of the document |
ENUM, SET |
string |
The label; a SET's labels comma-separated |
A declared lookup (.Lookup(...)) |
ArxEntityReference |
Name from the referenced table's .DisplayName(...) |
| A selection set column | Its stored code | entity.GetSelectionSet(column, set, catalog) gives the option |
| NULL | null |
The attribute is present, with a null value |
RealCase1_EveryDataTypeReadBack writes one row of every type with Create and prints each value's .NET type as it
reads back.