MySQL 数据类型
Halo 数据库在 MySQL 兼容模式下支持 MySQL 常用的数据类型,包括数字类型、字符类型、日期类型、SET 和 ENUM 等。
数字类型
支持的整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,均支持 SIGNED 和 UNSIGNED 属性。支持的浮点类型包括 FLOAT、DOUBLE、NUMERIC / DECIMAL。
mysql> CREATE TABLE int_mytest (
id INT,
id_signed INT SIGNED,
id_unsigned INT UNSIGNED
);
Query OK, 0 rows affected
mysql> INSERT INTO int_mytest VALUES (-123, -456, 789), (0, 0, 0), (456, 789, 123);
Query OK, 3 rows affected
mysql> SELECT * FROM int_mytest;
+------+-----------+-------------+
| id | id_signed | id_unsigned |
+------+-----------+-------------+
| -123 | -456 | 789 |
| 0 | 0 | 0 |
| 456 | 789 | 123 |
+------+-----------+-------------+
mysql> CREATE TABLE float_mytest (id FLOAT, id_unsigned FLOAT UNSIGNED);
Query OK, 0 rows affected
mysql> INSERT INTO float_mytest VALUES (-12.34, 56.78), (0, 0), (123.45, 678.90);
Query OK, 3 rows affected
mysql> SELECT * FROM float_mytest;
+--------+-------------+
| id | id_unsigned |
+--------+-------------+
| -12.34 | 56.78 |
| 0 | 0 |
| 123.45 | 678.9 |
+--------+-------------+
字符类型
支持的字符类型包括 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。
mysql> CREATE TABLE char_mytest (
id INT,
char_value CHAR(10),
varchar_value VARCHAR(50)
);
Query OK, 0 rows affected
mysql> INSERT INTO char_mytest VALUES (1, 'Hello', 'World'), (2, 'MySQL', 'Compatible');
Query OK, 2 rows affected
mysql> SELECT * FROM char_mytest;
+------+------------+----------------+
| id | char_value | varchar_value |
+------+------------+----------------+
| 1 | Hello | World |
| 2 | MySQL | Compatible |
+------+------------+----------------+
ENUM 类型
ENUM 是 MySQL 特有的字符串枚举类型,定义时指定一组允许的取值。
mysql> CREATE TABLE enum_mytest (
id INT,
status ENUM('active', 'inactive', 'pending')
);
Query OK, 0 rows affected
mysql> INSERT INTO enum_mytest VALUES (1, 'active'), (2, 'inactive'), (3, 'pending');
Query OK, 3 rows affected
mysql> SELECT * FROM enum_mytest;
+------+----------+
| id | status |
+------+----------+
| 1 | active |
| 2 | inactive |
| 3 | pending |
+------+----------+
SET 类型
SET 是 MySQL 特有的字符串集合类型,可包含 0 个或多个预定义成员。
mysql> CREATE TABLE set_mytest (
id INT,
options SET('A1', 'A2', 'B1', 'B2')
);
Query OK, 0 rows affected
mysql> INSERT INTO set_mytest VALUES (1, 'A1,A2'), (2, 'A1,B1');
Query OK, 2 rows affected
mysql> SELECT * FROM set_mytest;
+------+---------+
| id | options |
+------+---------+
| 1 | A1,A2 |
| 2 | A1,B1 |
+------+---------+
日期与时间类型
支持 MySQL 常用的日期与时间类型,包括 DATE、DATETIME、TIMESTAMP 和 YEAR。DATETIME 与 TIMESTAMP 都用于记录日期与时间,存储格式为 YYYY-MM-DD HH:MM:SS;仅传入日期部分时,时间部分自动补 00:00:00。
mysql> CREATE TABLE time_mytest (
id INT,
dt DATETIME,
ts TIMESTAMP
);
Query OK, 0 rows affected
mysql> INSERT INTO time_mytest VALUES
(1, '2026-08-12 10:30:45', '2026-08-12 10:30:45'),
(2, '2026-06-15', '2026-06-15');
Query OK, 2 rows affected
mysql> SELECT * FROM time_mytest;
+------+---------------------+---------------------+
| id | dt | ts |
+------+---------------------+---------------------+
| 1 | 2026-08-12 10:30:45 | 2026-08-12 10:30:45 |
| 2 | 2026-06-15 00:00:00 | 2026-06-15 00:00:00 |
+------+---------------------+---------------------+
说明:Halo 的 TIMESTAMP 默认不会随行更新自动取当前时间(即不具备 ON UPDATE CURRENT_TIMESTAMP 的隐式行为),其默认值为 NULL,行为与 DATETIME 一致。如需更新时自动刷新,需在建表时显式指定 ON UPDATE CURRENT_TIMESTAMP。
YEAR 类型
YEAR 是 1 字节的年份类型,用于表示年份值。Halo 的 YEAR 类型有效范围为 1901 ~ 2155,接受该范围内的 4 位数字或字符串。
mysql> CREATE TABLE year_mytest (id INT, yr YEAR);
Query OK, 0 rows affected
mysql> INSERT INTO year_mytest VALUES (1, 2026), (2, '1999');
Query OK, 2 rows affected
mysql> SELECT * FROM year_mytest;
+------+------+
| id | yr |
+------+------+
| 1 | 2026 |
| 2 | 1999 |
+------+------+
注意:与原生 MySQL 不同,Halo 的 YEAR 类型通过检查约束(CHECK (1901 <= yr AND yr <= 2155))限定取值,不支持 2 位年份的自动转换(即 '99' 不会转换为 1999、70 不会转换为 1970),传入 2 位数字或字符串、或范围外的值会报"违反检查约束"错误。请始终使用 4 位年份。