通过pyodbc读取Sybase image列时数据被截断至32KiB的问题
问题原因与解决办法
问题根源
这是FreeTDS的默认textsize限制导致的。FreeTDS默认仅读取32KB左右的大字段数据(对应你看到的33KB截断),和pyodbc本身的读取限制无关。
解决办法
1. 修改FreeTDS全局配置
编辑/etc/freetds/freetds.conf,在[global]段或者你的目标数据库连接段中添加:
text size = 10485760
(10485760字节=10MB,可根据实际文件大小调整更大值),保存后新的连接会自动生效。
2. 在Python代码中临时设置TEXTSIZE
在执行查询前,通过SQL命令临时设置当前连接的textsize,覆盖默认限制:
driver = "FreeTDS" prt = 'port' db = 'db' passwd = 'passwd' usr = 'usr' serv = 'serv' conn = pyodbc.connect(driver=driver, server=serv, port=prt, uid=usr, pwd=passwd) # 新增:设置textsize为10MB conn.execute("SET TEXTSIZE 10485760") sql_query = ( "SELECT ARCH_DOC_DOC as file_content FROM table_name WHERE ARCH_DOC_ID = id" ) cursor = conn.cursor() cursor.execute(sql_query) pdf_data = cursor.fetchone()[0] with open('my_test_file.pdf', 'wb') as f: f.write(pdf_data)
3. 优化FreeTDS的TDS版本配置
当前FreeTDS的TDS版本设为auto,建议明确指定为Sybase兼容的版本(比如8.0),在freetds.conf中添加:
tds version = 8.0
避免协商到低版本协议影响大字段读取。
验证
修改后重新运行代码,检查生成的PDF文件大小是否与数据库中原始文件一致,且能正常打开。
内容的提问来源于stack exchange,提问作者Mohamed Amine Mejri
相关产品推荐
相关产品推荐

