클라이언트 엔드에서 HEX로 변환하는 것과 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")
나는 결국 16 진수로 끝납니다 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 데이터 유형을 16 진 문자열로 변환하기위한 것입니다. 문자열에 이진 데이터가 포함되어 있어도 문자열을 전달함으로써 혼란 스러울 수 있습니다. 이 경우 Oracle은 16 진 문자 문자열을 기대하기 때문에 16 진 문자 문자열을 제공합니다.
다른 팁
RAWTOHEX
안에 Oracle
비트 주문은 무감각하지만 컴퓨터에서는 물론 민감합니다.
또한 논쟁에 주목하십시오 RAWTOHEX()
암시 적으로 변환 될 수 있습니다 VARCHAR2
라이브러리에 의해 (즉, 전송 된 SQLT_STR
), 이로 인해 인코딩 및 협업에 민감합니다.
나는 보통 Oracle 종류의 원시 데이터 유형을 쿼리로 전달하려고 할 때 적절한 유형의 가변 바인딩을 특별히 설정했습니다.
예를 들어 :
self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
"INSERT INTO bin_test (b) VALUES (rawtohex(?))",
(value,)
)
제휴하지 않습니다 StackOverflow