在系统迭代过程中,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中手动创建