PyODBC 和 MariaDB:文本列截断长度超过 127 个字符的字符串

问题描述 投票:0回答:1

我正在使用 PyODBC 版本 4.0.39 和 MariaDB 版本 11。在我的数据库中,我有一个文本列,我需要在其中存储字符串。但是,我注意到,当我尝试插入长度大于 127 个字符的字符串时,它会被截断并变成乱码。

我还注意到,如果我避免使用数据绑定并直接在 SQL 查询中传递参数,则不会出现截断问题。然而,我不愿意采用这种方法,因为它容易受到 SQL 注入攻击。

这是一个示例输入字符串: "{'用户名': 'retailer1.User236485', '方法': [{'SSH': True}, {'TLS': True}, {'SSHTLS': False}, {'OPENVPN': True}], ‘服务ID’:2}”

插入字符串后我在数据库中看到的是: '{''用户名'':''retailer1.User236485'',''方法'':[{''SSH'':True},{''TLS'':True},{''SSHTLS'': False}, {''OPENVPN'': True}], ''ServiceI✀㨀 ㈀纪'

我执行插入操作的代码如下:

def runQueryAndGetAffectedRowsSynchronous(self, transaction: List[Tuple[str, Tuple]]):
    cncx = self.__DatabaseConnection.cursor()
    affectedRowCount = []
    try:
        for t in transaction:
            count = cncx.execute(t[0], t[1]).rowcount
            affectedRowCount.append(count)
    except Exception as e:
        print(e)
        cncx.rollback()
    else:
        cncx.commit()
    finally:
        cncx.close()
    return affectedRowCount

我的连接字符串:

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

我想知道为什么会发生这种截断,以及如何解决它以将完整的字符串存储在文本列中。任何见解或建议将不胜感激。谢谢!

python mariadb odbc pyodbc
1个回答
0
投票

我已经解决了PyODBC和MariaDB中字符串截断的问题。解决方案是在执行SQL查询之前使用encode()方法使用utf-8编码对字符串进行编码。这确保了完整的字符串存储在数据库中,没有任何截断。 例子: v = v.encode(编码=“utf-8”)

© www.soinside.com 2019 - 2024. All rights reserved.