java每日精进 2.13 MySql迁移人大金仓
1.迁移数据库
1. 数据库创建语句
- MySQL:
CREATE DATABASE dbname;
- 人大金仓(Kingbase):
- 在人大金仓中,
CREATE DATABASE
的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持等),人大金仓默认使用UTF-8
编码。
CREATE DATABASE dbname ENCODING='UTF8';
- 在人大金仓中,
2. 数据类型差异
-
BOOLEAN
类型:- MySQL 将
BOOLEAN
映射为TINYINT(1)
,而 人大金仓 使用BOOLEAN
类型(与 PostgreSQL 相同)。 - MySQL:
CREATE TABLE example (flag BOOLEAN);
- 人大金仓:
CREATE TABLE example (flag BOOLEAN);
- MySQL 将
-
AUTO_INCREMENT
和SERIAL
:- MySQL 使用
AUTO_INCREMENT
来定义自增字段,而 人大金仓 使用SERIAL
。 - MySQL:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY);
- 人大金仓:
CREATE TABLE users (id SERIAL PRIMARY KEY);
- MySQL 使用
-
TEXT
类型:- 在 MySQL 中,
TEXT
是可以存储长文本的类型,而 人大金仓(基于 PostgreSQL)也使用TEXT
,但它支持更复杂的文本操作。 - MySQL:
CREATE TABLE article (content TEXT);
- 人大金仓:
CREATE TABLE article (content TEXT);
- 在 MySQL 中,
-
ENUM
类型:- MySQL 支持
ENUM
类型,但人大金仓没有直接支持这个类型。如果需要在人大金仓中使用ENUM
,可以考虑使用CHECK
约束或者VARCHAR
类型,并加上合理的值限制。 - MySQL:
CREATE TABLE example (status ENUM('active', 'inactive'));
- 人大金仓:
CREATE TABLE example (status VARCHAR(10) CHECK (status IN ('active', 'inactive')));
- MySQL 支持
-
DATETIME
和TIMESTAMP
:- MySQL 中有
DATETIME
和TIMESTAMP
类型,而 人大金仓 使用TIMESTAMP
,它的表现可能有所不同。人大金仓会根据 PostgreSQL 的规范处理TIMESTAMP
类型,可能需要特别关注时区问题。 - MySQL:
CREATE TABLE events (event_time DATETIME);
- 人大金仓:
CREATE TABLE events (event_time TIMESTAMP);
- MySQL 中有
3. 表的引擎设置
- MySQL 使用
ENGINE
来指定表的存储引擎(如InnoDB
、MyISAM
等)。 - 人大金仓(PostgreSQL)不使用
ENGINE
语法,所有表都使用统一的存储引擎,所以需要删除这些与存储引擎相关的配置。 - MySQL:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
- 人大金仓:
CREATE TABLE users (id INT SERIAL PRIMARY KEY);
4. 外键约束与索引
- MySQL 支持外键约束,人大金仓也支持,但语法上可能有些许差异(尤其是在删除/更新外键时的行为可能有所不同)。
- MySQL:
CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) );
- 人大金仓:
CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) );
5. 字符串处理函数
- MySQL 中的一些字符串处理函数与 人大金仓 中的函数可能不完全一样。例如:
- MySQL:
SELECT CONCAT(first_name, ' ', last_name) FROM users;
- 人大金仓:
SELECT first_name || ' ' || last_name FROM users;
- MySQL:
6. 注释和分隔符
- MySQL 支持
--
和#
注释样式,但人大金仓使用--
或/* */
。 - MySQL:
-- This is a comment # Another comment
- 人大金仓:
-- This is a comment /* Another comment */
7. LIMIT
与 FETCH
- MySQL 使用
LIMIT
来限制查询的行数。 - 人大金仓(PostgreSQL)也使用
LIMIT
,但在某些情况下,特别是涉及OFFSET
时,可能需要调整语法。 - MySQL:
SELECT * FROM users LIMIT 10;
- 人大金仓:
SELECT * FROM users LIMIT 10;
8. 日期与时间函数
- MySQL 提供许多日期和时间函数,如
NOW()
,CURDATE()
等。 - 人大金仓 也有类似的函数,但它们的名称和语法可能有所不同。例如,
CURRENT_TIMESTAMP
是标准的 SQL 函数。 - MySQL:
SELECT NOW();
- 人大金仓:
SELECT CURRENT_TIMESTAMP;
9. 触发器和存储过程
- MySQL 和人大金仓都支持触发器和存储过程,但语法上有所不同。存储过程和函数在 MySQL 中使用
DELIMITER
来指定分隔符,而人大金仓不需要使用DELIMITER
,直接定义即可。 - MySQL:
DELIMITER $$ CREATE PROCEDURE my_procedure() BEGIN SELECT 'Hello, World'; END$$ DELIMITER ;
- 人大金仓:
CREATE OR REPLACE PROCEDURE my_procedure() AS BEGIN RAISE NOTICE 'Hello, World'; END;
10. SQL 调试和测试
在迁移过程中,建议使用人大金仓提供的调试工具,逐步测试每个 SQL 语句,检查是否有语法或功能上的问题,特别是与数据类型、函数、触发器等相关的部分。
总结:
要将 MySQL 的 .sql
文件修改成能在人大金仓中运行的文件,主要的调整集中在以下几个方面:
- 替换 MySQL 特有的数据类型和关键字(如
AUTO_INCREMENT
→SERIAL
)。 - 删除与存储引擎相关的配置(如
ENGINE=InnoDB
)。 - 替换不兼容的函数(如字符串拼接、日期函数等)。
- 根据人大金仓的 SQL 标准调整外键和约束的语法。
- 确保注释和分隔符的语法符合人大金仓的规范。
在修改完成后,建议在人大金仓的测试环境中运行 SQL 文件,确保没有语法错误或功能冲突。
举例:
Mysql:
CREATE TABLE `member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`ip` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`app_id` varchar(255) DEFAULT NULL,
`group_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kingbase:
CREATE TABLE "member" (
"id" BIGSERIAL NOT NULL, -- 使用 BIGSERIAL 替代 AUTO_INCREMENT
"create_time" TIMESTAMP DEFAULT NULL,-- 使用 TIMESTAMP 替代 datetime
"update_time" TIMESTAMP DEFAULT NULL,
"ip" VARCHAR(255) DEFAULT NULL,
"name" VARCHAR(255) DEFAULT NULL,
"app_id" VARCHAR(255) DEFAULT NULL,
"group_id" VARCHAR(255) DEFAULT NULL,
PRIMARY KEY ("id")
);
2.配置数据
人大金仓使用sql编辑器执行和导入脚本;

3.配置文件修改
原来的application.yml如下:
spring:
jpa:
database: mysql
show-sql: true
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #不加这句则默认为myisam引擎
profiles:
active: ${ENV:local}
logging:
file: ./logback.log
server:
port: 8888
修改后如下:
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect # 使用人大金仓兼容的Mysql的方言
profiles:
active: ${ENV:local} # 默认激活 local 配置文件
logging:
file: ./logback.log
server:
port: 8888
application-local.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/blockchain_manager?autoReconnect=true&useUnicode=true&useSSL=false
username: root
password: 123456
修改后:
spring:
datasource:
url: jdbc:kingbase8://localhost:54321/database8 # 人大金仓数据库的连接 URL
username: **** # 人大金仓数据库的用户名
password: **** # 人大金仓数据库的密码
driver-class-name: com.kingbase8.Driver # 人大金仓数据库的驱动类
application-prod.yml:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${MYSQL_URL}/blockchain_manager?autoReconnect=true&useUnicode=true
username: md
password: ${MYSQL_PASS}
server:
port: 8080
修改后:
spring:
datasource:
url: jdbc:kingbase8://${KINGBASE_URL}:54321/blockchain_manager # 人大金仓数据库的连接 URL
username: SYSTEM # 人大金仓数据库的用户名
password: ${KINGBASE_PASS} # 人大金仓数据库的密码
driver-class-name: com.kingbase8.Driver # 人大金仓数据库的驱动类
server:
port: 8080
application-prod.yml 中的KINGBASE_URL以及KINGBASE_PASS在生产环境中设置环境变量即可;
可以通过终端设置环境变量。比如,如果你使用的是 bash
或 zsh
,可以在终端中使用以下命令设置环境变量:
export KINGBASE_URL=your_kingbase_url
export KINGBASE_PASS=your_kingbase_password
如果你希望在每次启动终端时都能自动设置这些环境变量,可以将这些命令添加到 ~/.bashrc
(或者 ~/.zshrc
)文件中:
echo "export KINGBASE_URL=your_kingbase_url" >> ~/.bashrc
echo "export KINGBASE_PASS=your_kingbase_password" >> ~/.bashrc
注:如何在 Spring Boot 中引用环境变量
在 application-prod.yml
文件中引用环境变量时,Spring Boot 会自动解析环境变量并将其替换。例如:
spring:
datasource:
url: jdbc:kingbase8://${KINGBASE_URL}:54321/blockchain_manager
username: SYSTEM
password: ${KINGBASE_PASS}
driver-class-name: com.kingbase8.Driver