我有一个像这样创建的表:

CREATE TABLE bin_test
(id INTEGER PRIMARY KEY, b BLOB)

使用Python和cx_Oracle,如果我这样做:

value = "\xff\x00\xff\x00" #The string represented in hex by ff00ff00
self.connection.execute("INSERT INTO bin_test (b) VALUES (rawtohex(?))",
                        (value,))
self.connection.execute("SELECT b FROM bin_test")

我最终得到了 a000a000 的十六进制值,这是不正确的!但是,如果我这样做:

import binascii
value = "\xff\x00\xff\x00"
self.connection.execute("INSERT INTO bin_test (b) VALUES (?)",
                        (binascii.hexlify(value,)))
self.connection.execute("SELECT b FROM bin_test")

我得到了正确的结果。我这里有一个类型转换系统,但在这里描述它有点困难。因此,有人能指出我是否在SQL级别做错了什么或者我的转换是否发生了奇怪的事情?

有帮助吗?

解决方案

rawtohex()用于将Oracles RAW数据类型转换为十六进制字符串。即使字符串包含二进制数据,也可能会因为传递字符串而感到困惑。在这种情况下,由于Oracle需要一个十六进制字符串,所以给它一个十六进制字符串。

其他提示

Oracle 中的 RAWTOHEX 对位顺序不敏感,而在您的计算机上它当然是敏感的。

另请注意, RAWTOHEX()的参数可以由库隐式转换为 VARCHAR2 (即作为 SQLT_STR 传输),使编码和校对敏感。

我通常在尝试将Oracle类型的RAW数据类型传递给查询时,特别设置了正确类型的变量绑定。

例如:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top