我正在使用 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))
我想知道为什么会发生这种截断,以及如何解决它以将完整的字符串存储在文本列中。任何见解或建议将不胜感激。谢谢!
我已经解决了PyODBC和MariaDB中字符串截断的问题。解决方案是在执行SQL查询之前使用encode()方法使用utf-8编码对字符串进行编码。这确保了完整的字符串存储在数据库中,没有任何截断。 例子: v = v.encode(编码=“utf-8”)