在客户端转换为十六进制和使用rawtohex之间有什么区别?
题
我有一个像这样创建的表:
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,)
)
不隶属于 StackOverflow