PyODBC连接MariaDB时Text字段截断长字符串问题求助
问题原因分析
- ODBC驱动默认参数长度限制:MariaDB ODBC 3.1驱动处理字符串参数时,默认会将其映射为
VARCHAR(127)类型,插入超过127字符的内容时会被截断,后续乱码是截断后编码不完整导致的。 - 字符集不匹配:连接字符串未指定字符集,导致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
相关产品推荐
相关产品推荐

