Skip to content

Commit 52c09af

Browse files
committed
Add note for field type
1 parent efddbd1 commit 52c09af

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

notes/field_type.md

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
2+
There are several `types` for each field (column) type, such as `type()`/`real_type()/binlog_type()` ...
3+
4+
By default, `real_type()` and `binlog_type()` are the same as `type()`:
5+
6+
```
7+
// From mysql-8.0/sql/field.h Field
8+
9+
// ...
10+
virtual enum_field_types real_type() const { return type(); }
11+
virtual enum_field_types binlog_type() const {
12+
/*
13+
Binlog stores field->type() as type code by default.
14+
This puts MYSQL_TYPE_STRING in case of CHAR, VARCHAR, SET and ENUM,
15+
with extra data type details put into metadata.
16+
17+
We cannot store field->type() in case of temporal types with
18+
fractional seconds: TIME(n), DATETIME(n) and TIMESTAMP(n),
19+
because binlog records with MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME
20+
type codes do not have metadata.
21+
So for temporal data types with fractional seconds we'll store
22+
real_type() type codes instead, i.e.
23+
MYSQL_TYPE_TIME2, MYSQL_TYPE_DATETIME2, MYSQL_TYPE_TIMESTAMP2,
24+
and put precision into metatada.
25+
26+
Note: perhaps binlog should eventually be modified to store
27+
real_type() instead of type() for all column types.
28+
*/
29+
return type();
30+
}
31+
// ...
32+
```
33+
34+
Here is a list collected from `mysql-8.0/sql/field.h`:
35+
36+
```
37+
+------------------------------------------------------------+-------------------------------+-----------------------+------------------------+
38+
| Field | type() | real_type() | binlog_type() |
39+
+------------------------------------------------------------+-------------------------------+-----------------------+------------------------+
40+
| | | | |
41+
| Field (abstract) | | | |
42+
| | | | | |
43+
| +--Field_bit | MYSQL_TYPE_BIT | | |
44+
| | +--Field_bit_as_char | | | |
45+
| | | | | |
46+
| +--Field_num (abstract) | | | |
47+
| | | +--Field_real (abstract) | | | |
48+
| | | +--Field_decimal | MYSQL_TYPE_DECIMAL | | |
49+
| | | +--Field_float | MYSQL_TYPE_FLOAT | | |
50+
| | | +--Field_double | MYSQL_TYPE_DOUBLE | | |
51+
| | | | | | |
52+
| | +--Field_new_decimal | MYSQL_TYPE_NEWDECIMAL | | |
53+
| | +--Field_short | MYSQL_TYPE_SHORT | | |
54+
| | +--Field_medium | MYSQL_TYPE_INT24 | | |
55+
| | +--Field_long | MYSQL_TYPE_LONG | | |
56+
| | +--Field_longlong | MYSQL_TYPE_LONGLONG | | |
57+
| | +--Field_tiny | MYSQL_TYPE_TINY | | |
58+
| | +--Field_year | MYSQL_TYPE_YEAR | | |
59+
| | | | | |
60+
| +--Field_str (abstract) | | | |
61+
| | +--Field_longstr | | | |
62+
| | | +--Field_string | MYSQL_TYPE_STRING | MYSQL_TYPE_STRING | |
63+
| | | +--Field_varstring | MYSQL_TYPE_VARCHAR | MYSQL_TYPE_VARCHAR | |
64+
| | | +--Field_blob | MYSQL_TYPE_BLOB | | |
65+
| | | +--Field_geom | MYSQL_TYPE_GEOMETRY | | |
66+
| | | +--Field_json | MYSQL_TYPE_JSON | | |
67+
| | | +--Field_typed_array | real_type_to_type(m_elt_type) | m_elt_type | MYSQL_TYPE_TYPED_ARRAY |
68+
| | | | | | |
69+
| | +--Field_null | MYSQL_TYPE_NULL | | |
70+
| | +--Field_enum | MYSQL_TYPE_STRING | MYSQL_TYPE_ENUM | |
71+
| | +--Field_set | | MYSQL_TYPE_SET | |
72+
| | | | | |
73+
| +--Field_temporal (abstract) | | | |
74+
| +--Field_time_common (abstract) | | | |
75+
| | +--Field_time | MYSQL_TYPE_TIME | | |
76+
| | +--Field_timef | MYSQL_TYPE_TIME | MYSQL_TYPE_TIME2 | MYSQL_TYPE_TIME2 |
77+
| | | | | |
78+
| +--Field_temporal_with_date (abstract) | | | |
79+
| +--Field_newdate | MYSQL_TYPE_DATE | MYSQL_TYPE_NEWDATE | |
80+
| +--Field_temporal_with_date_and_time (abstract) | | | |
81+
| +--Field_timestamp | MYSQL_TYPE_TIMESTAMP | | |
82+
| +--Field_datetime | MYSQL_TYPE_DATETIME | | |
83+
| +--Field_temporal_with_date_and_timef (abstract) | | | |
84+
| +--Field_timestampf | MYSQL_TYPE_TIMESTAMP | MYSQL_TYPE_TIMESTAMP2 | MYSQL_TYPE_TIMESTAMP2 |
85+
| +--Field_datetimef | MYSQL_TYPE_DATETIME | MYSQL_TYPE_DATETIME2 | MYSQL_TYPE_DATETIME2 |
86+
+------------------------------------------------------------+-------------------------------+-----------------------+------------------------+
87+
```

0 commit comments

Comments
 (0)