跳到主要内容

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 位年份。