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

PyODBC连接MariaDB时Text字段截断长字符串问题求助

问题原因分析
  1. ODBC驱动默认参数长度限制:MariaDB ODBC 3.1驱动处理字符串参数时,默认会将其映射为VARCHAR(127)类型,插入超过127字符的内容时会被截断,后续乱码是截断后编码不完整导致的。
  2. 字符集不匹配:连接字符串未指定字符集,导致Python字符串编码与数据库字段编码不一致,加剧了截断后的乱码问题。
解决方法

1. 修改连接字符串,指定字符集

在连接字符串中添加CHARSET=utf8mb4参数,确保Python与数据库的字符编码统一,避免编码转换导致的乱码:

conn = pyodbc.connect(
    f'DRIVER={{MariaDB ODBC 3.1 Driver}};SERVER={self.__server};DATABASE={self.__database};'
    f'ENCRYPT=no;UID={self.__username};PWD={self.__password};Trusted_connection=no;'
    f'Port={self.__port};CHARSET=utf8mb4'
)

2. 显式设置参数类型为长文本

使用pyodbc.setinputsizes()方法,将字符串参数指定为SQL_LONGVARCHAR类型,覆盖驱动默认的长度限制,确保长字符串完整插入:

def runQueryAndGetAffectedRowsSynchronous(self, transaction: List[Tuple[str, Tuple]]):
    cncx = self.__DatabaseConnection.cursor()
    affectedRowCount = []
    try:
        for t in transaction:
            sql, params = t
            # 为每个字符串参数指定长文本类型
            input_sizes = []
            for param in params:
                input_sizes.append(pyodbc.SQL_LONGVARCHAR if isinstance(param, str) else None)
            cncx.setinputsizes(*input_sizes)
            count = cncx.execute(sql, params).rowcount
            affectedRowCount.append(count)
    except Exception as e:
        print(e)
        cncx.rollback()
    else:
        cncx.commit()
    finally:
        cncx.close()
    return affectedRowCount

3. 升级MariaDB ODBC驱动

当前使用的3.1版本驱动可能存在参数长度处理的bug,建议升级到最新稳定版(如4.0+),新版本通常会修复这类兼容性问题。

4. 确认数据库字段字符集

检查目标Text字段的字符集是否为utf8mb4,确保与连接字符串指定的字符集一致:

ALTER TABLE your_table MODIFY COLUMN your_text_column TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

内容的提问来源于stack exchange,提问作者pooria sanjarani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:58:11