UDB-TX MySQL兼容模式快速入门

概述

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

image-20251116211925763

安装

参考步骤

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

image-20251116202811204

配置

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

PixPin_2025-11-16_20-42-16

通信协议

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;

image-20251116194844807

数据类型

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数据类型演示表';

image-20251116135538734

字符集

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;

image-20251116140102535

数据对象

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