MySQL与DM字段类型映射大全及示例DDL对比
作者:Full Stack Developme
达梦作为国产数据库,其数据类型与Oracle风格更接近,在与MySQL进行数据迁移、应用适配时需要特别注意类型的选择。
核心原则
精度优先:映射时优先考虑数据精度和范围,而非名称一致。
长度差异:字符串类型长度定义语义不同(MySQL是字符数,达梦默认是字节数,但可指定字符集)。
无符号处理:MySQL支持
UNSIGNED,达梦没有此概念,需用更大范围的有符号类型承载。自动递增:MySQL用
AUTO_INCREMENT,达梦用IDENTITY(1,1)。布尔类型:MySQL有
BOOL/TINYINT(1),达梦有BIT或TINYINT。
数据类型映射大全
| 分类 | MySQL 数据类型 | 达梦 (DM8) 推荐映射类型 | 关键说明与注意事项 |
|---|---|---|---|
| 整数类型 | TINYINT | TINYINT | 范围相同(-128 ~ 127)。MySQL的无符号TINYINT(0~255)需映射为达梦的 SMALLINT。 |
TINYINT UNSIGNED | SMALLINT | ||
SMALLINT | SMALLINT | 范围相同(-32768 ~ 32767)。MySQL无符号需映射为达梦 INT。 | |
SMALLINT UNSIGNED | INT | ||
MEDIUMINT | INT | MySQL特有类型。达梦用 INT 足够容纳(-8388608~8388607)。无符号需用 BIGINT。 | |
MEDIUMINT UNSIGNED | BIGINT | ||
INT / INTEGER | INT | 范围相同。MySQL无符号需映射为达梦 BIGINT。 | |
INT UNSIGNED | BIGINT | ||
BIGINT | BIGINT | 范围相同。MySQL无符号无完美对应类型,可考虑 DECIMAL(20,0) 或 BIGINT(需应用层确保非负)。 | |
BIGINT UNSIGNED | DECIMAL(20,0) 或 BIGINT + 约束 | ||
| 小数/数值 | DECIMAL(M,D) / NUMERIC(M,D) | DECIMAL(M,D) / NUMERIC(M,D) | 最安全映射。精度与标度定义一致。M为总位数,D为小数位。 |
FLOAT(M,D) | FLOAT | 不推荐指定M,D。达梦的 FLOAT 是浮点数,精度行为与MySQL可能有细微差异。对于精确数值,请使用 DECIMAL。 | |
DOUBLE(M,D) | DOUBLE / DOUBLE PRECISION | 同上,不推荐指定M,D。 | |
| 日期时间 | DATE | DATE | 完全兼容。 |
TIME | TIME | 完全兼容。 | |
DATETIME | DATETIME | 注意:MySQL 5.6+的DATETIME支持毫秒(DATETIME(6)),达梦DATETIME精度到秒。如需毫秒,应使用 DATETIME(6) 或 TIMESTAMP(6)。 | |
DATETIME(fsp) | DATETIME(fsp) 或 TIMESTAMP(fsp) | 重点:必须指定小数秒精度(fsp),如 DATETIME(3)。 | |
TIMESTAMP | TIMESTAMP | 达梦 TIMESTAMP 默认带时区(但存储的是时间戳值),行为与MySQL的TIMESTAMP(自动时区转换)有本质不同。迁移时需评估业务逻辑。 | |
TIMESTAMP(fsp) | TIMESTAMP(fsp) | 同上,并注意精度匹配。 | |
YEAR | SMALLINT | MySQL特有。用2位或4位年份,达梦无直接对应,通常用 SMALLINT 存储4位年份。 | |
| 字符串类型 | CHAR(N) | CHAR(N) | 重要区别:MySQL的N是字符数,达梦默认是字节数。若使用中文字符集(如UTF8),达梦应定义为 CHAR(N CHAR)。 |
VARCHAR(N) | VARCHAR2(N CHAR) | 最佳实践:达梦中推荐使用 VARCHAR2。始终使用 (N CHAR) 来按字符定义长度,避免乱码和截断。最大长度受页大小限制(通常支持到8188字符左右)。 | |
TINYTEXT | VARCHAR2(255 CHAR) | 根据实际最大长度选择合适的大小。 | |
TEXT | CLOB | 大文本字段。达梦的 CLOB 行为与MySQL TEXT 类似,但函数、索引支持有差异。 | |
MEDIUMTEXT | CLOB | ||
LONGTEXT | CLOB | ||
ENUM('v1','v2') | VARCHAR2(100 CHAR) + 检查约束 | MySQL特有。达梦中可用CHECK约束模拟。 | |
SET('v1','v2') | VARCHAR2(200 CHAR) 或 多对多关系表 | MySQL特有。建议范式化或程序逻辑处理。 | |
| 二进制类型 | BINARY(N) | CHAR(N) BYTE | 定长二进制。 |
VARBINARY(N) | VARBINARY(N) 或 RAW(N) | 变长二进制。达梦 RAW 更常用。 | |
TINYBLOB | BLOB | 达梦的 BLOB 可覆盖所有MySQL的BLOB变体。 | |
BLOB | BLOB | ||
MEDIUMBLOB | BLOB | ||
LONGBLOB | BLOB | ||
| 其他类型 | BIT(M) | BIT 或 VARBIT | 位类型。达梦 BIT 是单比特,VARBIT 可变长度。MySQL BIT(8) 可用达梦 BINARY(1) 或 VARBIT(8) 模拟。 |
BOOL, BOOLEAN | TINYINT 或 BIT | 本质都是 TINYINT(1)。达梦中可用 TINYINT,或用 BIT 表示真/假。 | |
JSON | VARCHAR2(4000 CHAR) / CLOB + 应用层解析 | 达梦无原生JSON类型(DM8新版本已支持JSON,但语法函数不同)。通常用文本存储,或用 LONGVARCHAR。 | |
GEOMETRY等空间类型 | 无直接对应,可用 BLOB / RAW 存储WKB | 达梦对空间数据支持有限,需应用层处理。 | |
| 自增列 | INT AUTO_INCREMENT PRIMARY KEY | INT IDENTITY(1,1) PRIMARY KEY | 语法不同。达梦使用 IDENTITY 关键字。 |
迁移与开发建议
字符串长度定义:在达梦DDL中,对于中文字符集,务必使用
VARCHAR2(50 CHAR)而非VARCHAR2(50),后者是按字节计算,容易导致字符截断。日期时间精度:如果MySQL使用了
DATETIME(3)等带精度的类型,达梦必须对应使用DATETIME(3),否则会丢失毫秒信息。TIMESTAMP 时区陷阱:这是最大的坑。MySQL的
TIMESTAMP会在存取时根据会话时区转换,存储为UTC;达梦的TIMESTAMP存储的是“日期时间值”,没有自动时区转换。强烈建议:如果业务不关心时区,只用本地时间,两边都用
DATETIME。如果需要时区支持,达梦侧需使用
TIMESTAMP WITH TIME ZONE,并在应用层仔细处理。
无符号处理:在达梦侧,对原MySQL的无符号列,考虑增加
CHECK(column >= 0)约束来保证数据一致性。工具辅助:使用达梦的 DTS 迁移工具 可以自动完成大部分类型映射,但工具转换后必须人工核对上述关键点,尤其是字符串和日期类型。
测试验证:务必对边界值(如最大长度、日期范围、大数值)进行充分测试,确保数据存储、查询、计算的结果一致。
示例DDL对比
-- MySQL 表 CREATE TABLE user ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, age TINYINT UNSIGNED, balance DECIMAL(10,2), created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3), description TEXT ); -- 对应的达梦表(建议) CREATE TABLE user ( id BIGINT IDENTITY(1,1) PRIMARY KEY, -- 无符号INT用BIGINT承载 name VARCHAR2(30 CHAR) NOT NULL, -- 使用CHAR语义定义长度 age SMALLINT, -- 无符号TINYINT用SMALLINT balance DECIMAL(10,2), created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3), -- 保持精度 description CLOB );
这份映射表涵盖了绝大多数场景,实际使用时请结合达梦数据库的具体版本(如DM8)官方文档和您的业务数据特征进行最终决定。
总结
到此这篇关于MySQL与DM字段类型映射大全及示例DDL对比的文章就介绍到这了,更多相关MySQL与DM字段类型映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
