java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库

1. 数据库创建语句

  • MySQL

    CREATE DATABASE dbname;

  • 人大金仓(Kingbase)

    • 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持等),人大金仓默认使用 UTF-8 编码。

    CREATE DATABASE dbname ENCODING='UTF8';

2. 数据类型差异

  • BOOLEAN 类型

    • MySQLBOOLEAN 映射为 TINYINT(1),而 人大金仓 使用 BOOLEAN 类型(与 PostgreSQL 相同)。

    • MySQL

      CREATE TABLE example (flag BOOLEAN);

    • 人大金仓

      CREATE TABLE example (flag BOOLEAN);

  • AUTO_INCREMENTSERIAL

    • MySQL 使用 AUTO_INCREMENT 来定义自增字段,而 人大金仓 使用 SERIAL

    • MySQL

      CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY);

    • 人大金仓

      CREATE TABLE users (id SERIAL PRIMARY KEY);

  • TEXT 类型

    • 在 MySQL 中,TEXT 是可以存储长文本的类型,而 人大金仓 (基于 PostgreSQL)也使用 TEXT,但它支持更复杂的文本操作。

    • MySQL

      CREATE TABLE article (content TEXT);

    • 人大金仓

      CREATE TABLE article (content TEXT);

  • 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')));

  • DATETIMETIMESTAMP

    • MySQL 中有 DATETIMETIMESTAMP 类型,而 人大金仓 使用 TIMESTAMP,它的表现可能有所不同。人大金仓会根据 PostgreSQL 的规范处理 TIMESTAMP 类型,可能需要特别关注时区问题。

    • MySQL

      CREATE TABLE events (event_time DATETIME);

    • 人大金仓

      CREATE TABLE events (event_time TIMESTAMP);

3. 表的引擎设置

  • MySQL 使用 ENGINE 来指定表的存储引擎(如 InnoDBMyISAM 等)。

  • 人大金仓 (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;

6. 注释和分隔符

  • MySQL 支持 --# 注释样式,但人大金仓使用 --/* */

  • MySQL

    -- This is a comment # Another comment

  • 人大金仓

    -- This is a comment /* Another comment */

7. LIMITFETCH

  • 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 文件修改成能在人大金仓中运行的文件,主要的调整集中在以下几个方面:

  1. 替换 MySQL 特有的数据类型和关键字(如 AUTO_INCREMENTSERIAL)。
  2. 删除与存储引擎相关的配置(如 ENGINE=InnoDB)。
  3. 替换不兼容的函数(如字符串拼接、日期函数等)。
  4. 根据人大金仓的 SQL 标准调整外键和约束的语法。
  5. 确保注释和分隔符的语法符合人大金仓的规范。

在修改完成后,建议在人大金仓的测试环境中运行 SQL 文件,确保没有语法错误或功能冲突。

举例:

Mysql:

java 复制代码
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:

java 复制代码
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如下:

java 复制代码
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

修改后如下:

java 复制代码
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

java 复制代码
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

修改后:

java 复制代码
spring:
  datasource:
    url: jdbc:kingbase8://localhost:54321/database8  # 人大金仓数据库的连接 URL
    username: ****  # 人大金仓数据库的用户名
    password: ****  # 人大金仓数据库的密码
    driver-class-name: com.kingbase8.Driver  # 人大金仓数据库的驱动类

application-prod.yml:

java 复制代码
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

修改后:

java 复制代码
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在生产环境中设置环境变量即可;

可以通过终端设置环境变量。比如,如果你使用的是 bashzsh,可以在终端中使用以下命令设置环境变量:

java 复制代码
export KINGBASE_URL=your_kingbase_url
export KINGBASE_PASS=your_kingbase_password

如果你希望在每次启动终端时都能自动设置这些环境变量,可以将这些命令添加到 ~/.bashrc(或者 ~/.zshrc)文件中:

java 复制代码
echo "export KINGBASE_URL=your_kingbase_url" >> ~/.bashrc
echo "export KINGBASE_PASS=your_kingbase_password" >> ~/.bashrc

注:如何在 Spring Boot 中引用环境变量

application-prod.yml 文件中引用环境变量时,Spring Boot 会自动解析环境变量并将其替换。例如:

java 复制代码
spring:
  datasource:
    url: jdbc:kingbase8://${KINGBASE_URL}:54321/blockchain_manager
    username: SYSTEM
    password: ${KINGBASE_PASS}
    driver-class-name: com.kingbase8.Driver
相关推荐
kabcko12 分钟前
CentOS安装Mysql
mysql·adb·centos
ruleslol25 分钟前
MySQL 工具使用指南
mysql
爱学java的ptt31 分钟前
mysql的存储引擎
数据库·mysql
龘龍龙1 小时前
Python基础学习(十一)
python·学习·mysql
不屈的铝合金1 小时前
SQL 语言概述与数据库核心前置配置了解
数据库·sql·mysql·约束·sql 语句分类·字符集配置·校对规则
萧曵 丶1 小时前
可重复读(Repeatable Read)隔离级别下幻读产生的原因
数据库·sql·mysql
Antoine-zxt1 小时前
MySQL宕机日志迷局破解指南:从前台启动到精准排错
数据库·mysql·adb
·云扬·1 小时前
MySQL运维效率提升:实用SQL语句合集
运维·sql·mysql
剑来.2 小时前
一次完整的 MySQL 性能问题排查思路(线上实战总结)
数据库·mysql·oracle
欢乐的小猪3 小时前
windows10如何安装多个版本mysql
数据库·mysql