Qual è la differenza tra la conversione in esadecimale sul lato client e l'utilizzo di rawtohex?

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

Domanda

Ho una tabella creata in questo modo:

CREATE TABLE bin_test
(id INTEGER PRIMARY KEY, b BLOB)

Usando Python e cx_Oracle, se lo faccio:

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")

Alla fine finisco con un valore esadecimale di a000a000 , che non è corretto! Tuttavia, se lo faccio:

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")

Ottengo il risultato corretto. Ho un sistema di conversione del tipo qui, ma è un po 'difficile descriverlo qui. Quindi, qualcuno può indicarmi nella giusta direzione se sto facendo qualcosa di sbagliato a livello SQL o se qualcosa di strano sta accadendo con le mie conversioni?

È stato utile?

Soluzione

rawtohex () serve per convertire i tipi di dati RAW di Oracles in stringhe esadecimali. È possibile che ti confonda passando una stringa, anche se la stringa contiene dati binari. In questo caso, poiché Oracle prevede una stringa di caratteri esadecimali, assegnagli una stringa di caratteri esadecimali.

Altri suggerimenti

RAWTOHEX in Oracle non è sensibile all'ordine dei bit, mentre sulla tua macchina è ovviamente sensibile.

Nota anche che un argomento in RAWTOHEX () può essere implicitamente convertito in VARCHAR2 dalla tua libreria (ovvero trasmesso come SQLT_STR ), che lo rende anche sensibile alla codifica e alle regole di confronto.

Di solito imposto il tipo corretto di associazioni di variabili specialmente quando provo a passare una specie di tipo di dati RAW di Oracle in una query.

ad esempio qualcosa del tipo:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top