sqlite数据库整体迁移进mysql整个流程并解决中文异常问题

咨询+【QQ

sqlite轻量数据还行,随着数据量增大,不得不迁移进mysql

首先 电脑执行
 

sqlite3 db.sqlite3 .dump > dump.sql

会把整个sqlite的数据导出进 dump.sql中

紧接着我们把sqlite的sql转换成mysql的sql语句,因为mysql语句和 sqlite的sql有区别,所以我们需要用python实现一个转换脚本

import re


def convert_sqlite_to_mysql(sql):
    # 移除 PRAGMA 语句
    sql = re.sub(r'PRAGMA .*?;', '', sql)

    # 修改 BEGIN TRANSACTION 为 START TRANSACTION
    sql = sql.replace('BEGIN TRANSACTION;', 'START TRANSACTION;')

    # 替换 COMMIT TRANSACTION 为 COMMIT
    sql = sql.replace('COMMIT;', 'COMMIT;')

    # 替换 ROLLBACK TRANSACTION 为 ROLLBACK
    sql = sql.replace('ROLLBACK;', 'ROLLBACK;')

    # 修改 AUTOINCREMENT 为 AUTO_INCREMENT
    sql = sql.replace('AUTOINCREMENT', 'AUTO_INCREMENT')

    # 替换数据类型
    sql = sql.replace('INTEGER', 'INT')
    sql = sql.replace('TEXT', 'VARCHAR(255)')

    # 替换双引号为反引号
    sql = sql.replace('"', '`')

    # 添加 CHARACTER SET utf8mb4 到表定义中
    sql = re.sub(r'CREATE TABLE `(.*?)` \(', r'CREATE TABLE IF NOT EXISTS `\1` (', sql)
    # sql = re.sub(r'\);', r') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;', sql)

    # 处理 INSERT 语句,确保数据字符集正确
    sql = re.sub(r'INSERT INTO `(.*?)` \((.*?)\) VALUES', r'INSERT INTO `\1` (\2) VALUES', sql)
    sql = re.sub(r'INSERT INTO `sqlite_sequence`.*?;', '', sql)
    return sql

# 读取原始的 SQLite dump 文件
with open('dump.sql', 'r', encoding='utf-8') as file:
    sql_dump = file.read()

# 转换为 MySQL 兼容的 SQL
mysql_compatible_sql = convert_sqlite_to_mysql(sql_dump)

# 将转换后的 SQL 写入新的文件
with open('dump_mysql.sql', 'w', encoding='utf-8') as file:
    file.write(mysql_compatible_sql)

print("SQL conversion complete. Please check 'dump_mysql.sql' for MySQL import.")

执行py脚本生成dump_mysql.sql

这样就转换好了,紧接着进入mysql创建数据库 mydatabase

CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mydatabase;

去mysql安装目录,执行。linux直接执行此命令就行

mysql -u root -p mydatabase < dump_mysql.sql

#如果遇到中文报错\u等报错,数据导入的时候就需要用一下命令,指定字符集导入进mysql

mysql --default-character-set=utf8mb4 -u root -p mydatabase < dump_mysql.sql

然后输入mysql对应的密码,就行了

等待数据转存完,就行了。可能会报一个  sqlite_sequence 之类的异常,并不影响数据。至此就行了

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值