在客户端转换为十六进制与使用rawtohex有什么区别?

2 投票
3 回答
1048 浏览
提问于 2025-04-15 12:27

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

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层面上是否做错了什么,或者我的转换过程中是否发生了什么奇怪的事情吗?

3 个回答

0

我通常会在传递类似Oracle的RAW数据类型到查询时,设置合适的变量类型。

比如像这样:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
1

RAWTOHEXOracle 中对位的顺序不敏感,也就是说它不会在意数据的排列顺序。而在你的电脑上,这个顺序当然是敏感的,也就是说会影响结果。

另外要注意的是,传给 RAWTOHEX() 的参数可能会被你的库自动转换成 VARCHAR2 类型(也就是以 SQLT_STR 的形式传输),这就使得它对编码和排序规则也变得敏感。

1

rawtohex() 是用来把 Oracle 数据库中的 RAW 数据类型转换成十六进制字符串的。如果你传给它一个字符串,即使这个字符串里面有二进制数据,它可能会搞混淆。在这种情况下,因为 Oracle 需要的是一串十六进制字符,所以你应该给它一串十六进制字符。

撰写回答