UDB-TX MySQL兼容模式快速入门
概述
UDB-TX 运行在兼容模式下,除了默认的5678端口监听PostgreSQL协议,还开启另外一个端口监听特定兼容数据库的协议。

安装
参考步骤
mkdir -p ~/UDB-TX_V25.0_build_TX_MySQL
tar -xzf UDB-TX_V25.0_build_TX_MySQL_22.18.1.0devel-openEuler_20.03_x86_64.tar.gz -C ~/UDB-TX_V25.0_build_TX_MySQL
export UDB_HOME=~/UDB-TX_V25.0_build_TX_MySQL
export PATH=$UDB_HOME/bin:$PATH
export LD_LIBRARY_PATH=$UDB_HOME/lib:$LD_LIBRARY_PATH
export UDDATA=$UDB_HOME/data
initdb -D $UDDATA

配置
ud_ctl -D $UDDATA -l logfile start
netstat -nultp | grep unvdb
ps -ef | grep unvdb
ud_sql
select udb_version();
set password_encryption=mysql_native_password;
#备注:注意需superuser权限
create user test superuser password 'test';
select * from pg_shadow where usename='test';
ifconfig | grep inet

通信协议
UDB-TX在MySQL兼容模式下原生支持了MySQL通讯协议。可以使用标准的MySQL Client连接UDB-TX,使用体感与MySQL无异。
$ mysql -P 3306 -h 173.1.12.23 -utest -p
create database unvdb_mysqldb;
show databases;
use unvdb_mysqldb;

数据类型
UDB-TX在MySQL兼容模式下支持了绝大部分常用数据类型,基本可以满足日常的需要。以下是具体类型表格
| 类型分类 | 具体类型 | 是否支持 |
|---|---|---|
| 整数类型 | TINYINT / SMALLINT / MEDIUMINT / BIGINT | 支持 |
| 整数类型 | INT / INTEGER | 支持 |
| 浮点数与定点数 | FLOAT[(M,D)] / DOUBLE[(M,D)] | 支持 |
| 浮点数与定点数 | DECIMAL[(M,D)] / NUMERIC | 支持 |
| 日期时间类型 | DATE / TIME / DATETIME | 支持 |
| 日期时间类型 | TIMESTAMP / YEAR[(4)] | 支持 |
| 字符串类型 | CHAR(M) / VARCHAR(M) | 支持 |
| 字符串类型 | TINYTEXT / TEXT / MEDIUMTEXT / LONGTEXT | 支持 |
| 枚举与集合 | ENUM / SET | 支持(不支持数字索引插入) |
| 二进制类型 | BINARY(M) / VARBINARY(M) | 支持 |
| 二进制类型 | TINYBLOB / BLOB / MEDIUMBLOB / LONGBLOB | 支持 |
| 特殊类型 | BIT(M) | 支持 |
| 特殊类型 | JSON | 支持 |
| 空间数据类型 | GEOMETRY | 不支持 |
sql示例
CREATE TABLE udb_mysql_data_types_demo (
-- 整数类型
tinyint_col TINYINT COMMENT '微小整数: 1字节, -128到127',
smallint_col SMALLINT COMMENT '小整数: 2字节, -32768到32767',
mediumint_col MEDIUMINT COMMENT '中等整数: 3字节, -8388608到8388607',
bigint_col BIGINT COMMENT '大整数: 8字节, ±9.22×10¹⁸',
int_col INT COMMENT '整数: 4字节, -2147483648到2147483647',
integer_col INTEGER COMMENT '整数(INT的别名)',
bool_col BOOL COMMENT '布尔类型: TINYINT(1)的别名, 0或1',
boolean_col BOOLEAN COMMENT '布尔类型(BOOL的别名)',
-- 浮点数与定点数
float_col FLOAT(7,4) COMMENT '单精度浮点数: 4字节, 约7位精度',
double_col DOUBLE(15,8) COMMENT '双精度浮点数: 8字节, 约15位精度',
decimal_col DECIMAL(10,2) COMMENT '定点数: 精确小数, 适合金额计算',
numeric_col NUMERIC(10,2) COMMENT '数值类型(DECIMAL的别名)',
-- 日期时间类型
date_col DATE COMMENT '日期: YYYY-MM-DD',
time_col TIME COMMENT '时间: HH:MM:SS',
datetime_col DATETIME COMMENT '日期时间: YYYY-MM-DD HH:MM:SS',
timestamp_col TIMESTAMP COMMENT '时间戳: 1970-2038, 自动时区转换',
year_col YEAR COMMENT '年份: 1901-2155',
-- 字符串类型
char_col CHAR(10) COMMENT '定长字符串: 最大255字符',
varchar_col VARCHAR(100) COMMENT '变长字符串: 最大65535字符',
tinytext_col TINYTEXT COMMENT '微型文本: 最大255字节',
text_col TEXT COMMENT '文本: 最大64KB',
mediumtext_col MEDIUMTEXT COMMENT '中等文本: 最大16MB',
longtext_col LONGTEXT COMMENT '长文本: 最大4GB',
-- 枚举与集合
enum_col ENUM('男','女','未知') COMMENT '枚举: 从预定义值中选择一个',
set_col SET('阅读','音乐','运动','旅游') COMMENT '集合: 从预定义值中选择多个',
-- 二进制类型
binary_col BINARY(20) COMMENT '定长二进制: 存储二进制数据',
varbinary_col VARBINARY(100) COMMENT '变长二进制: 存储可变二进制数据',
tinyblob_col TINYBLOB COMMENT '微型BLOB: 最大255字节二进制数据',
blob_col BLOB COMMENT 'BLOB: 最大64KB二进制数据',
mediumblob_col MEDIUMBLOB COMMENT '中等BLOB: 最大16MB二进制数据',
longblob_col LONGBLOB COMMENT '长BLOB: 最大4GB二进制数据',
-- 特殊类型
bit_col BIT(8) COMMENT '位字段: 存储位值',
json_col JSON COMMENT 'JSON数据: 存储结构化JSON数据'
-- 注意: GEOMETRY空间数据类型不支持,故不包含在此表中
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MySQL数据类型演示表';

字符集
UDB-TX在MySQL兼容模式下支持了多种字符集,比如utf8mb4、gbk、latin1等等。但在处理上是做了简化处理,只保留了对utf8mb4的支持,其他会做忽略处理。
-- mysql_t2 表 (MySQL标准语法)
CREATE TABLE `mysql_t2` (
`record_id` int unsigned NOT NULL AUTO_INCREMENT,
`binary_data` varbinary(100) DEFAULT NULL,
`chinese_gbk` char(20) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL,
`long_text` text CHARACTER SET latin1 COLLATE latin1_swedish_ci,
`unicode_data` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`raw_blob` blob,
`legacy_utf8` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`standard_chinese` varchar(200) CHARACTER SET gb18030 COLLATE gb18030_chinese_ci DEFAULT NULL,
PRIMARY KEY (`record_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='多字符集测试表';
-- udb_mysql_t2 表 (UDB-TX定制语法)
CREATE TABLE `udb_mysql_t2` (
`record_id` int unsigned NOT NULL AUTO_INCREMENT,
`binary_data` varbinary(100) DEFAULT NULL,
`chinese_gbk` char(20) DEFAULT NULL,
`long_text` text DEFAULT NULL,
`unicode_data` varchar(500) DEFAULT NULL,
`raw_blob` blob DEFAULT NULL,
`legacy_utf8` varchar(100) DEFAULT NULL,
`standard_chinese` varchar(200) DEFAULT NULL,
PRIMARY KEY (`record_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据对象
UDB-TX在MySQL兼容模式下支持大部分数据对象,常见的表、索引、约束、视图等都没问题。对于MySQL一些个性化的能力,比如前缀索引、全局索引不支持。
表
| 对象分类 | 数据对象 | 支持情况 |
|---|---|---|
| 表 | 普通表 | 支持 |
| 分区表 | 不支持 |
CREATE TABLE sales (
id INT,
product VARCHAR(50),
region INT
)
PARTITION BY LIST (region) (
PARTITION p_east VALUES IN (1, 2, 3),
PARTITION p_west VALUES IN (4, 5, 6),
PARTITION p_other VALUES IN (DEFAULT)
);
ERROR 1478 (HY000): syntax error at or near "("
#执行报错
视图及自增
| 对象分类 | 数据对象 | 支持情况 |
|---|---|---|
| 视图 | 普通视图 | 支持 |
| 复杂视图 | 支持 | |
| 可更新视图 | 支持 | |
| 其他 | 自增 | 支持 |
CREATE TABLE `minimal_table` (
`record_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID(自增主键)',
PRIMARY KEY (`record_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='最小化自增主键表';
索引及约束
| 对象分类 | 数据对象 | 支持情况 |
|---|---|---|
| 索引 | 普通索引 | 支持 |
| 联合索引 | 支持 | |
| 唯一索引 | 支持 | |
| 前缀索引 | 支持 | |
| 全文索引 | 不支持 | |
| 约束 | ||
| 主键 | 支持 | |
| 外键 | 支持 | |
| 非空 | 支持 | |
| 唯一 | 支持 | |
| 检查 | 支持 | |
| 默认 | 支持 |
#创建表
-- 创建部门表
CREATE TABLE `department` (
`dept_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '部门ID(主键)',
`dept_name` varchar(50) NOT NULL COLLATE utf8mb4_general_ci COMMENT '部门名称(唯一非空)',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`dept_id`),
UNIQUE KEY `department_dept_name_key` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.02 sec)
#创建正常
-- 创建员工表
CREATE TABLE `employee` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '员工ID',
`name` varchar(100) NOT NULL COLLATE utf8mb4_general_ci COMMENT '姓名',
`email` varchar(100) NOT NULL COLLATE utf8mb4_general_ci COMMENT '邮箱(唯一)',
`status` tinyint DEFAULT 1 COMMENT '状态: 0-禁用 1-启用',
`gender` enum('M','F','O') NOT NULL COMMENT '性别: M-男 F-女 O-其他',
`dept_id` int unsigned NOT NULL COMMENT '部门ID',
`id_card` char(18) DEFAULT NULL COLLATE utf8mb4_general_ci COMMENT '身份证号',
`mobile` char(11) DEFAULT NULL COLLATE utf8mb4_general_ci COMMENT '手机号',
`entry_date` date NOT NULL COMMENT '入职日期',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `employee_email_key` (`email`),
UNIQUE KEY `employee_unique_idcard_mobile` (`id_card`, `mobile`),
CONSTRAINT `fk_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`dept_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';
Query OK, 0 rows affected (0.02 sec)
#创建正常
#创建索引
-- 邮箱唯一索引(已存在)
CREATE UNIQUE INDEX `idx_employee_email` ON `employee` (`email`);
-- 部门名称唯一索引(已存在)
CREATE UNIQUE INDEX `idx_department_name` ON `department` (`dept_name`);
-- 唯一索引已存在这里展示语法
-- 员工姓名的普通索引(用于快速姓名查询)
CREATE INDEX `idx_employee_name` ON `employee` (`name`);
-- 部门+状态的联合索引(用于按部门查询员工状态)
CREATE INDEX `idx_employee_dept_status` ON `employee` (`dept_id`, `status`);
内置函数
| 函数分类 | 函数 | 支持情况 |
|---|---|---|
| 日期与时间 | 当前时间 | 支持 |
| 计算与转换 | 支持 | |
| 字符串处理 | 拼接与分割 | 支持 |
| 清洗与转换 | 支持 | |
| 数学计算 | 处理与格式化 | 支持 |
| 条件与逻辑 | 空值处理与条件判断 | 支持 |
| 多条件分支 | 支持 | |
| 聚合与统计 | 汇总分析 | 支持 |
| 其他 | 类型转换与编码 | 支持 |
日期时间函数
-- 获取当前日期时间
SELECT NOW(); -- 返回格式:YYYY-MM-DD HH:MM:SS
SELECT CURDATE(); -- 返回当前日期
SELECT CURTIME(); -- 返回当前时间
-- 日期计算与格式化
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 7天后的日期时间
SELECT DATEDIFF('2025-09-15', '2025-09-29'); -- 计算两个日期天数差
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i'); -- 格式化日期时间输出
字符串处理函数
-- 字符串拼接与分割
SELECT CONCAT_WS('-', '2025', '09', '19'); -- 带分隔符拼接字符串
SELECT SUBSTRING_INDEX('www.example.com', '.', 2); -- 按分隔符截取字符串
-- 字符串清洗与转换
SELECT TRIM(' MySQL函数示例 '); -- 去除首尾空格
SELECT REPLACE('Hello World', 'World', 'MySQL'); -- 文本替换
SELECT LOWER('MySQL FUNCTIONS'); -- 转换为小写
数学计算函数
SELECT ROUND(3.14159, 2); -- 四舍五入保留两位小数
SELECT FLOOR(9.99); -- 向下取整
SELECT FORMAT(1234567.89, 2); -- 千分位格式化数字
SELECT RAND(); -- 生成0~1的随机浮点数
条件与逻辑函数
SELECT IFNULL(NULL, '默认值'); -- 空值替换
SELECT COALESCE(NULL, NULL, '第一个非空值'); -- 多参数空值处理
聚合统计函数
SELECT COUNT(*) FROM test; -- 统计总行数
SELECT GROUP_CONCAT(username SEPARATOR ', ') FROM test01; -- 合并多行文本
SELECT AVG(salary) AS avg_salary FROM test; -- 计算平均值
类型转换函数
SELECT CAST('2025-09-09' AS DATE); -- 字符串转日期类型
SELECT MD5('unvdb@123'); -- 生成MD5哈希值
附:MySQL相关配置参数
mysql.conf
cat $UDDATA/mysql.conf
#for MySQL specific parameter or extensions that are needed to be installed at initdb
#shared_preload_libraries = ''
database_compat_mode = 'mysql' # database compat mode, values can be:
# unvdbtx (default)
# mysql (MySQL mode)
# oracle (ORACLE mode)
# sqlserver (SQLServer mode)
mysql.listener_on = true # (enable MySQL listener; change requires restart)
mysql.port = 3306 # (second_port is for MySQL mode; change requires restart)
mysql.version = '5.7.32-log' # (change requires restart)
#mysql.ci_collation = true # (change requires restart)
#mysql.explicit_defaults_for_timestamp = false # (change requires restart)
#mysql.auto_rollback_tx_on_error = false # (change requires restart)
#mysql.ci_collation = 0 # (change requires restart)
#mysql.column_name_case_control = 0 # (change requires restart)
#mysql.max_allowed_packet = 536870912B # (512MB, change requires restart)
#mysql.support_multiple_table_update = true # (change requires restart)
# lines begining with #@@ will treat as CREATE EXTENSION orderly
#@@mysql_adapter
unvdbsvr.conf
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
#port = 5678 # (change requires restart)
ud_hba.conf
host all all 0/0 md5