Pandas保存DataFrame到MySQL时series_id列值异常转换问题排查
问题:Pandas保存DataFrame到MySQL时series_id被强制转为2147483647
表结构定义
CREATE TABLE series_info ( series_id INT NOT NULL PRIMARY KEY, s_area VARCHAR(40) NOT NULL, s_code VARCHAR(10) NOT NULL, dataset_version VARCHAR(20) NOT NULL );
Python代码片段
# 向df_series_info插入3条记录 conn = sqlalchemy.create_engine( \ f"mysql+mysqlconnector://{DATABASER_USER}:{DATABASER_PASSWORD}@{DATABASE_HOST}/{DATABASE}") print(df_series_info.dtypes) print(df_series_info.head()) df_series_info.to_sql(name='series_info', con=conn, if_exists='append', index=False)
问题现象
执行代码后触发主键重复错误,提示2147483647重复,但DataFrame中series_id的实际值远大于该数值。若移除PRIMARY KEY约束,代码可正常运行,但所有行的series_id均被替换为2147483647。
问题原因与解决办法
核心原因:数据类型范围不匹配
MySQL的INT类型是32位有符号整数,最大值为2147483647。当DataFrame中的series_id数值超过这个上限时,mysqlconnector会将超出范围的数值强制截断为INT类型的最大值,进而导致主键重复或所有值被统一替换。解决步骤
- 修改MySQL表字段类型:将
series_id改为BIGINT(64位有符号整数,最大值为9223372036854775807),足以容纳更大的数值:ALTER TABLE series_info MODIFY COLUMN series_id BIGINT NOT NULL PRIMARY KEY; - 统一DataFrame字段类型:确保DataFrame中
series_id列的类型为int64,避免隐式转换问题:df_series_info['series_id'] = df_series_info['series_id'].astype('int64') - 重新执行写入操作:此时超出原
INT范围的数值会被正确写入,主键重复问题也会消失。
- 修改MySQL表字段类型:将
内容的提问来源于stack exchange,提问作者chrx
相关产品推荐
相关产品推荐

