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

7rfyedvj  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(161)

我使用PyODBC 4.0.39版和MariaDB 11版。在我的数据库中,我有一个文本列,我需要在其中存储字符串。然而,我注意到,当我尝试插入长度大于127个字符的字符串时,它会被截断并变成乱码。
我还注意到,如果我避免使用数据绑定而直接在SQL查询中传递参数,就不会有截断问题。但是,我不愿意采用这种方法,因为它容易受到SQL注入攻击。
下面是一个示例输入字符串:“你说:'retailer1.User236485','方法':['SSH':True},'TLS':True},返回“SSHTLS”:False},关闭“OPENVPN”:True}],“ServiceID”:2}”
在插入字符串后,我在数据库中看到的是:"用户名“:'' retailer1.User236485 '',''方法'':['' SSH'':True},'' TLS'':True},验证“SSHTLS”:False},删除“OPENVPN”:True}],''服务我的服务 '
我执行的插入代码如下:

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))

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

uyhoqukh

uyhoqukh1#

pyodbc可以为您处理编码,如wiki中所述
https://github.com/mkleehammer/pyodbc/wiki/Unicode#mysql

cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(encoding='utf-8')

这样你就不必记得自己编码每一个字符串。

yx2lnoni

yx2lnoni2#

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

相关问题