广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何实现Access数据库快速转换成MySQL数据库

在系统迭代过程中,Access数据库因性能和并发能力限制,常常需要迁移到MySQL。下面介绍两种常用的快速转换方法,适配不同技术背景的开发者。

如何实现Access数据库快速转换成MySQL数据库

方法一:通过ODBC驱动手动迁移

这种方法适合数据量较小、对迁移流程不熟悉的用户,操作步骤直观,不需要编写代码。

操作前提

  • 本地已安装Access数据库引擎和MySQL ODBC驱动
  • 已创建好目标MySQL数据库,且字符集设置为utf8mb4
  • Access数据库文件没有损坏,可正常打开

操作步骤

首先打开Access,选择要迁移的数据库文件,点击顶部菜单栏的外部数据,选择ODBC数据库,在弹出的窗口中选择导出到ODBC数据库,点击确定。之后选择已经配置好的MySQL ODBC数据源,输入MySQL的连接账号密码,选择要导出的表,按照提示完成导出即可。

方法二:Python脚本自动化迁移

这种方法适合数据量大、需要定期迁移或者需要自定义转换规则的场景,效率更高,可复用性强。

环境准备

需要安装两个Python库,分别是用于连接Access的pyodbc和用于连接MySQL的pymysql,可以通过pip命令安装:

# 安装依赖库
pip install pyodbc pymysql

完整迁移脚本

下面是适配大多数场景的迁移脚本,会自动处理数据类型映射,转换过程中保留表的字段属性和数据内容:

import pyodbc
import pymysql
# Access数据库连接配置
access_conn_str = (
    r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    r"DBQ=你的Access文件路径.accdb;"
)
# MySQL数据库连接配置
mysql_conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="你的MySQL密码",
    database="目标数据库名",
    charset="utf8mb4"
)
mysql_cursor = mysql_conn.cursor()
# 连接Access数据库
access_conn = pyodbc.connect(access_conn_str)
access_cursor = access_conn.cursor()
# 获取Access中所有表名
tables = access_cursor.tables(tableType="TABLE")
table_names = [table.table_name for table in tables]
# Access到MySQL的数据类型映射规则
type_mapping = {
    "COUNTER": "INT AUTO_INCREMENT PRIMARY KEY",
    "VARCHAR": "VARCHAR(255)",
    "LONG": "INT",
    "DOUBLE": "DOUBLE",
    "DATETIME": "DATETIME",
    "BIT": "TINYINT(1)",
    "MEMO": "TEXT"
}
for table_name in table_names:
    # 获取表的字段信息
    columns_info = access_cursor.columns(table=table_name)
    columns = []
    create_sql_parts = []
    for col in columns_info:
        col_name = col.column_name
        col_type = col.type_name
        # 映射数据类型,默认用VARCHAR兜底
        mysql_type = type_mapping.get(col_type, "VARCHAR(255)")
        columns.append(col_name)
        create_sql_parts.append(f"`{col_name}` {mysql_type}")
    # 创建MySQL表
    create_table_sql = f"CREATE TABLE IF NOT EXISTS `{table_name}` ({','.join(create_sql_parts)})"
    try:
        mysql_cursor.execute(create_table_sql)
    except Exception as e:
        print(f"创建表{table_name}失败:{e}")
        continue
    # 从Access读取数据插入MySQL
    select_sql = f"SELECT * FROM `{table_name}`"
    access_cursor.execute(select_sql)
    rows = access_cursor.fetchall()
    if rows:
        # 构造插入SQL
        placeholders = ",".join(["%s"] * len(columns))
        insert_sql = f"INSERT INTO `{table_name}` (`{'`,`'.join(columns)}`) VALUES ({placeholders})"
        try:
            mysql_cursor.executemany(insert_sql, rows)
            mysql_conn.commit()
            print(f"表{table_name}迁移完成,共插入{len(rows)}条数据")
        except Exception as e:
            print(f"表{table_name}插入数据失败:{e}")
            mysql_conn.rollback()
# 关闭所有连接
access_cursor.close()
access_conn.close()
mysql_cursor.close()
mysql_conn.close()

迁移注意事项

  • Access中的COUNTER自增字段迁移到MySQL后,需要确认自增属性是否正常,避免后续插入数据报错
  • 中文内容需要保证Access和MySQL的字符集一致,建议都使用utf8mb4,防止乱码
  • 迁移完成后要抽样检查数据,确认数值、日期、文本等内容和原Access数据库一致
  • 如果Access表中有索引、约束等对象,手动迁移方式不会自动转换,需要额外在MySQL中手动创建
广告位 · 文章底部(后台-模块管理替换此区域)