前言

在企业数字化转型过程中,数据库迁移始终是一个关键挑战。特别是从 SQL Server 向国产数据库迁移时,兼容性问题往往成为最大的技术壁垒。

金仓数据库(KingbaseES)作为国产数据库的代表,其 V9 版本在 SQL Server 兼容性方面做了大量优化。借着金仓 2025 体验官活动的机会(本期产品体验官倒计时 3 天!KVA PRO 这一次不容错过~)。本文将深入测试 KingbaseES 在 SQL Server 兼容模式下的语法特性,为有迁移需求的开发者提供实用的参考。

本次测试将重点验证 ROWVERSION、SQL_VARIANT、UNIQUEIDENTIFIER 等 SQL Server 特有数据类型和语法结构的兼容性表现。

环境准备

KES 一键安装

为提升部署效率,开发了金仓数据库一键安装脚本,显著简化了安装流程。相比之前详细的安装指南(金仓数据库 KingbaseES V9 单机安装指南),本次重点关注 SQL Server 兼容模式的快速部署。

安装脚本界面

测试环境部署时间约 90 秒,大幅提升了开发测试效率:

安装效果展示

KingbaseShellInstall 脚本开源地址:

https://gitee.com/luciferlpc/KingbaseShellInstall

开源项目截图

创建测试环境

创建专用的 SQL Server 兼容测试数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 查看默认数据库(SQL Server 兼容版包含 master、resource 等系统库)
-- master 数据库:记录了所有系统级信息,包括实例范围的元数据(例如登录帐户)、端点、链接服务器和系统配置设置。
-- Resource 数据库:只读数据库,包含了所有系统对象(如 sys.objects)。
test=# \l+
List of databases
Name | Owner | Encoding | Collate | Ctype | Iculocale | Access privileges | Size | Tablespace | Description
-----------+-----------+----------+-------------+-------------+-----------+-------------------+---------+-------------+--------------------------------------------
db_mssql | mssql_dba | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 40 kB | tbs_mssql |
kingbase | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 17 MB | sys_default | default administrative connection database
master | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 3 bytes | sys_default |
resource | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 17 MB | sys_default | default administrative connection database
security | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 17 MB | sys_default |
tempdb | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 3 bytes | sys_default |
template0 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | =c/system +| 17 MB | sys_default | unmodifiable empty database
| | | | | | system=CTc/system | | |
template1 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | =c/system +| 17 MB | sys_default | default template for new databases
| | | | | | system=CTc/system | | |
test | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | ci_x_icu | | 17 MB | sys_default | default administrative connection database

环境初始化步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 创建表空间目录
[root@orcl:/soft]# mkdir -p /tbs_mssql
[root@orcl:/soft]# chown -R kingbase:kingbase /tbs_mssql/
[root@orcl:/soft]# chmod 700 /tbs_mssql/

# 2. 创建表空间
test=# create tablespace tbs_mssql location '/tbs_mssql';
CREATE TABLESPACE

# 3. 创建测试用户
test=# create user mssql_dba password 'kingbase';
CREATE ROLE

# 4. 创建测试数据库(这里要使用 master 数据库才能创建)
master=# create database db_mssql owner=mssql_dba encoding=utf8 tablespace=tbs_mssql;
CREATE DATABASE

# 5. 连接测试数据库
[kingbase@orcl ~]$ ksql db_mssql mssql_dba
Password for user mssql_dba:
Licesen Type: SALES-企业版.
db_mssql=>

语法兼容性验证

为确保测试的准确性,本文同时使用在线 SQL Server 环境(SQL Fiddle)进行对比验证。

ROWVERSION 数据类型测试

测试目标: 验证版本控制机制的兼容性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 测试连续插入的版本号递增
CREATE TABLE t1 (id INT, ver ROWVERSION);
CREATE TABLE t2 (id INT, ver ROWVERSION);

INSERT INTO t1 (id) VALUES (1); -- ver = 1
INSERT INTO t2 (id) VALUES (1); -- ver = 2
INSERT INTO t1 (id) VALUES (2); -- ver = 3
INSERT INTO t2 (id) VALUES (2); -- ver = 4

-- 验证版本号全局递增
SELECT 't1' AS tbl, id, ver FROM t1
UNION ALL
SELECT 't2' AS tbl, id, ver FROM t2
ORDER BY ver;

KingbaseES 执行结果:

KingbaseES ROWVERSION 测试

SQL Server 执行结果:

SQL Server ROWVERSION 测试

兼容性评估:完全兼容

  • 版本号全局递增机制一致
  • 自动生成行为完全相同
  • 仅在初始值大小和显示格式上有表面差异

SQL_VARIANT 数据类型测试

测试目标: 验证多类型数据存储和相关函数支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 创建SQL_VARIANT测试表
CREATE TABLE test_variant (
id INT IDENTITY PRIMARY KEY,
data SQL_VARIANT
);

-- 插入不同类型数据
INSERT INTO test_variant (data) VALUES
(CAST(10 AS SQL_VARIANT)),
(CAST('Hello' AS SQL_VARIANT)),
(CAST(GETDATE() AS SQL_VARIANT));

-- 查询数据及元信息
SELECT
data,
SQL_VARIANT_PROPERTY(data, 'BaseType') AS DataType,
SQL_VARIANT_PROPERTY(data, 'Precision') AS Precision
FROM test_variant;

KingbaseES 执行结果:

KingbaseES SQL_VARIANT 测试

SQL Server 执行结果:

SQL Server SQL_VARIANT 测试

兼容性评估:完全兼容

  • 多类型数据存储功能一致
  • SQL_VARIANT_PROPERTY 函数完全支持
  • 数据类型识别准确

UNIQUEIDENTIFIER 数据类型测试

测试目标: 验证 GUID 生成和存储功能

1
2
3
4
5
6
7
8
-- 测试GUID自动生成
CREATE TABLE test_guid (
uid UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,
name VARCHAR(20)
);

INSERT INTO test_guid (name) VALUES ('Test');
SELECT uid, name FROM test_guid;

KingbaseES 执行结果:

KingbaseES UNIQUEIDENTIFIER 测试

SQL Server 执行结果:

SQL Server UNIQUEIDENTIFIER 测试

兼容性评估:完全兼容

  • NEWID()函数正常工作
  • GUID 格式标准(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  • 作为主键的约束机制一致

SYSNAME 数据类型测试

测试目标: 验证系统名称类型的支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 创建包含SYSNAME列的表
CREATE TABLE sysname_test (
object_id INT,
object_name SYSNAME,
schema_name SYSNAME
);

-- 插入系统对象名称数据
INSERT INTO sysname_test VALUES
(1, 'employees_table', 'hr_schema'),
(2, 'customers_table', 'sales_schema');

-- 查询数据
SELECT * FROM sysname_test;

KingbaseES 执行结果:

KingbaseES SYSNAME 测试

SQL Server 执行结果:

SQL Server SYSNAME 测试

兼容性评估:完全兼容

  • SYSNAME 类型定义一致
  • 长度限制和字符处理相同
  • 适用于系统对象命名场景

表变量功能测试

测试目标: 验证临时表变量的语法支持

1
2
3
4
5
6
7
8
-- 声明和使用表变量
DECLARE @employee TABLE (
id INT,
name VARCHAR(50)
)

INSERT INTO @employee VALUES (1, 'Alice'), (2, 'Bob')
SELECT * FROM @employee;

KingbaseES 执行结果:

KingbaseES 表变量测试

SQL Server 执行结果:

SQL Server 表变量测试

兼容性评估:完全兼容

  • 表变量声明语法一致
  • 临时数据存储和查询功能相同
  • 作用域和生命周期管理一致

兼容性测试结果

通过对 KingbaseES V9 SQL Server 兼容模式的深入测试,我们得出以下结论:

从测试结果看,KingbaseES 在 SQL Server 语法兼容性方面表现优异。

技术优势

  1. 降低迁移成本:现有 SQL Server 应用可以以最小改动迁移到 KingbaseES;
  2. 保持业务连续性:关键数据类型的完全兼容确保业务逻辑无需重构;
  3. 提升开发效率:开发人员可以继续使用熟悉的 SQL Server 语法和特性;

应用场景

  • 企业级系统国产化改造:金融、政府等对数据安全要求较高的行业;
  • 多数据库环境统一:简化运维复杂度,降低人员培训成本;
  • 云原生应用迁移:支持容器化部署,适应现代应用架构;

结论

对于有 SQL Server 迁移需求的企业,KingbaseES V9 确实是一个值得考虑的国产化替代方案。其在语法兼容性方面的出色表现,为企业的数字化转型和信息系统国产化提供了可靠的技术保障。

随着国产数据库技术的不断成熟,相信 KingbaseES 在未来会在更多复杂场景下展现出与 SQL Server 相当的兼容性和性能表现。


参考资料: