Python从TeradataDB查询数据到DataFrame时的编码问题
解决Teradata LATIN字符集数据查询乱码问题
问题核心
你的Teradata表使用CHARACTER SET LATIN存储波兰语数据,teradatasqlalchemy返回的\x8cWIDNICA是编码不匹配导致的——Teradata针对中欧语言的LATIN字符集对应**cp1250(Windows-1250)**编码,而非你尝试的cp1252、latin1或utf8。
可行解决方案
方案1:连接时指定正确字符集
直接在数据库连接URL中添加charset=cp1250参数,让驱动自动用正确编码解析数据:
import sqlalchemy as sqlal import pandas as pd # 修改连接字符串,加入charset参数 engine = sqlal.create_engine('teradatasql://ip_to_my_db/?user=user&password=pass!&tmode=TERA&charset=cp1250', pool_size=5) conn = engine.connect() try: query = """select addresses from WH_table""" data = pd.read_sql(query, con=conn) print(data) # 此时应输出正确的ŚWIDNICA except Exception as e: print(e) finally: conn.close()
方案2:批量转码已返回的数据
如果无法修改连接参数,可对DataFrame中的目标列批量处理,先将字符按latin1转成字节(保留原始字节值),再用cp1250解码:
# 在获取data之后执行转码 data['addresses'] = data['addresses'].apply(lambda x: x.encode('latin1').decode('cp1250')) print(data)
原因说明
Teradata的CHARACTER SET LATIN并非统一对应latin1编码:
- 针对西欧语言(如英语、法语)用cp1252
- 针对中欧语言(如波兰语、捷克语)用cp1250
Teradata Studio会根据数据库的区域配置自动适配编码,而teradatasqlalchemy默认编码不匹配,才导致Ś被解析成\x8c。
内容的提问来源于stack exchange,提问作者neek98
相关产品推荐
相关产品推荐

