在客户端转换为十六进制与使用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层面上是否做错了什么,或者我的转换过程中是否发生了什么奇怪的事情吗?
3 个回答
0
我通常会在传递类似Oracle的RAW数据类型到查询时,设置合适的变量类型。
比如像这样:
self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
"INSERT INTO bin_test (b) VALUES (rawtohex(?))",
(value,)
)
1
RAWTOHEX
在 Oracle
中对位的顺序不敏感,也就是说它不会在意数据的排列顺序。而在你的电脑上,这个顺序当然是敏感的,也就是说会影响结果。
另外要注意的是,传给 RAWTOHEX()
的参数可能会被你的库自动转换成 VARCHAR2
类型(也就是以 SQLT_STR
的形式传输),这就使得它对编码和排序规则也变得敏感。
1
rawtohex() 是用来把 Oracle 数据库中的 RAW 数据类型转换成十六进制字符串的。如果你传给它一个字符串,即使这个字符串里面有二进制数据,它可能会搞混淆。在这种情况下,因为 Oracle 需要的是一串十六进制字符,所以你应该给它一串十六进制字符。