클라이언트 엔드에서 HEX로 변환하는 것과 rawToHex 사용의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1034068

문제

다음과 같은 테이블이 있습니다.

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,)
)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top