2

我有一个这样创建的表:

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 级别做错了什么,或者我的转换是否发生了奇怪的事情吗?

4

3 回答 3

1

RAWTOHEXin 对Oracle位顺序不敏感,而在您的机器上它当然是敏感的。

另请注意,您的库RAWTOHEX()可以将参数隐式转换为VARCHAR2(即传输为SQLT_STR),这使得它也对编码和排序规则敏感。

于 2009-06-23T17:51:15.107 回答
1

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

于 2009-06-23T17:55:29.107 回答
0

我通常在尝试将某种 RAW 数据类型的 Oracle 传递给查询时专门设置正确的变量绑定类型。

例如:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
于 2009-11-10T19:29:34.230 回答