在数据迁移过程中,如何确保Access特有的字段类型(如Memo、OLE对象)与MySQL的兼容性?
pyodbc
SELECT*FROMMSysObjectsWHEREType=1ANDFlags=0
PRAGMAtable_info
GetSchema
Access与MySQL的数据类型需严格对应,常见转换规则如下:
Access字段类型 | MySQL对应类型 | 注意事项 |
---|---|---|
Text | VARCHAR(255) | 长文本需转为TEXT或MEDIUMTEXT |
Memo | TEXT | 避免截断长文本 |
AutoNumber | BIGINTAUTO_INCREMENT | 需手动添加自增约束 |
DateTime | DATETIME | 格式需统一(如YYYY-MM-DDHH:MM:SS) |
OLEObject | LONGBLOB | 二进制数据需保持完整性 |
CREATEINDEX
INSERTINTO...VALUES(...),(...),(...)
BEGINTRANSACTION
COMMIT
COUNT(*)
python复制importpyodbc importpymysql #连接Access数据库 access_conn=pyodbc.connect(r'DRIVER={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=path.accdb') access_cursor=access_conn.cursor() #连接MySQL数据库 mysql_conn=pymysql.connect(host='localhost',user='root',password='pwd',db='target_db') mysql_cursor=mysql_conn.cursor() #示例:迁移单个表 table_name='Employees' access_cursor.execute(f'SELECT*FROM{table_name}') rows=access_cursor.fetchall() #生成CREATETABLE语句(需根据字段类型动态调整) create_table_sql=f""" CREATETABLE{table_name}( IDBIGINTAUTO_INCREMENTPRIMARYKEY, NameVARCHAR(255), HireDateDATETIME ); """ mysql_cursor.execute(create_table_sql) #批量插入数据 insert_sql=f""" INSERTINTO{table_name}(Name,HireDate) VALUES(%s,%s) """ mysql_cursor.executemany(insert_sql,rows) mysql_conn.commit()
DateTime
#12/31/1899#
通过上述步骤,可系统性地完成Access到MySQL的复杂表结构迁移,同时兼顾数据完整性和性能优化。