使用SQLAlchemy read_sql读取MySQL大VARCHAR数据至Pandas DataFrame时内容被截断的解决方法咨询
解决Pandas读取MySQL长VARCHAR显示截断的问题
嘿,我来帮你搞定这个问题!首先得澄清一个关键点:你看到的输出截断大概率只是Pandas的显示限制,实际数据并没有被截断——不信你可以试试直接取那个字段的单个值查看真实长度:
# 取第一行的description字段,查看真实长度 print(len(df['description'].iloc[0]))
这个应该会返回49085,说明数据其实完整读进来了,只是打印DataFrame时被截断显示了。
接下来给你两个解决方案,分别对应显示问题和极端情况下的读取问题:
1. 修改Pandas显示设置,让长字符串完整显示
Pandas默认会对过长的列内容进行截断,你可以通过设置全局显示选项来关闭这个限制:
import pandas as pd # 设置显示最大列宽为无限制(或者设一个足够大的数值,比如50000) pd.set_option('display.max_colwidth', None) # 也可以顺便设置其他可能影响显示的选项,比如最大行数 pd.set_option('display.max_rows', None) # 再打印DataFrame就能看到完整内容了 print(df)
如果你只是临时需要查看某一列的完整内容,也可以单独对该列直接遍历打印:
# 遍历打印每一行的description完整内容 for desc in df['description']: print(desc) print("实际长度:", len(desc))
2. 极端情况:确保读取时不被截断(针对真·读取截断的场景)
如果上面的方法发现数据确实被截断了(这种情况比较少见),那可能是数据库连接层的限制,比如pymysql的数据包大小设置。你可以在创建SQLAlchemy引擎时添加连接参数,增大允许的数据包大小:
from sqlalchemy import create_engine # 添加max_allowed_packet参数,设置为10MB(根据你的数据大小调整) db_connection_str = 'mysql+pymysql://username:password@host/db_name' db_connection = create_engine( db_connection_str, connect_args={ 'max_allowed_packet': 1024 * 1024 * 10, # 10MB 'charset': 'utf8mb4' # 确保支持特殊字符 } ) # 重新读取数据 df = pd.read_sql("select id, description, length(description) as len from myTable where length(description) = 49085", con=db_connection)
最后再提醒一下:你之前用len(str(df['description']))得到87,是因为把整个Series对象转成了字符串,这个长度并不是单个字段的真实长度,一定要用iloc取单个元素再看长度哦!
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

