如何在python中将十六进制字符串转换为二进制以使用cx_oracle插入

Posted

技术标签:

【中文标题】如何在python中将十六进制字符串转换为二进制以使用cx_oracle插入【英文标题】:How to convert hex string to binary in python for insert using cx_oracle 【发布时间】:2012-02-11 18:27:19 【问题描述】:

我有一个包含 16 位十六进制数字列表的文本文件(例如“61C7393AA9B3474DB081C7B7CCE1C545”),我需要使用 cx_Oracle 将它们插入一个 Oracle RAW 列。 我试过这个:

sql = "INSERT INTO GUIDS VALUES (HEXTORAW(:1))"
ids = [l.strip() for l in guidfile.readlines()]
cursor.bindarraysize = len(ids)
cursor.setinputsizes(cx_Oracle.BINARY)
cursor.executemany(sql, ids)

但由于 cx_Oracle.DatabaseError: ORA-01036: 非法变量名称/编号而失败。 在调用 executemany 之前,我是否需要在 python 中将值转换为二进制?如果是这样怎么办?请注意,相同的 sql 适用于 cursor.execute 和单个值,它仅适用于我遇到问题的列表。

【问题讨论】:

【参考方案1】:

嗯,我已经通过几种方式解决了这个问题。首先,上面的代码是不正确的,因为它创建了一个值列表,而它应该创建一个元组列表。即

ids = [(l.strip(),) for l in guidfile.readlines()]

然后使用

cursor.setinputsizes(cx_Oracle.STRING)

它有效。 在最初的问题上 - 如何摆脱 hextoraw,我发现这是可行的:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)

【讨论】:

以上是关于如何在python中将十六进制字符串转换为二进制以使用cx_oracle插入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将十六进制转换为十进制? [复制]

如何在 Python 中将字符串转换为十六进制整数?

在 Python 中将整数转换为 2 字节的十六进制值

如何在 Python 中将单个字符转换为其十六进制 ASCII 值?

在python中将二进制转换为字符串

在 Python 中将十六进制字符串转换为字节列表