You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:02:43